Skip to content

Commit 7b3c50b

Browse files
authored
Merge pull request #162 from RalfJung/raw-wide
adjust for current reality wrt. wide raw pointers
2 parents 38b9a76 + d176807 commit 7b3c50b

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

src/what-unsafe-does.md

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@ to your program. You definitely *should not* invoke Undefined Behavior.
1616
Unlike C, Undefined Behavior is pretty limited in scope in Rust. All the core
1717
language cares about is preventing the following things:
1818

19-
* Dereferencing (using the `*` operator on) dangling, or unaligned pointers, or
20-
wide pointers with invalid metadata (see below)
19+
* Dereferencing (using the `*` operator on) dangling or unaligned pointers (see below)
2120
* Breaking the [pointer aliasing rules][]
22-
* Unwinding into another language
21+
* Calling a function with the wrong call ABI or unwinding from a function with the wrong unwind ABI.
2322
* Causing a [data race][race]
2423
* Executing code compiled with [target features][] that the current thread of execution does
2524
not support
@@ -30,15 +29,15 @@ language cares about is preventing the following things:
3029
* a null `fn` pointer
3130
* a `char` outside the ranges [0x0, 0xD7FF] and [0xE000, 0x10FFFF]
3231
* a `!` (all values are invalid for this type)
33-
* a reference that is dangling, unaligned, points to an invalid value, or
34-
that has invalid metadata (if wide)
35-
* slice metadata is invalid if the slice has a total size larger than
36-
`isize::MAX` bytes in memory
37-
* `dyn Trait` metadata is invalid if it is not a pointer to a vtable for
38-
`Trait` that matches the actual dynamic trait the reference points to
39-
* a `str` that isn't valid UTF-8
4032
* an integer (`i*`/`u*`), floating point value (`f*`), or raw pointer read from
4133
[uninitialized memory][]
34+
* a reference/`Box` that is dangling, unaligned, or points to an invalid value.
35+
* a wide reference, `Box`, or raw pointer that has invalid metadata:
36+
* `dyn Trait` metadata is invalid if it is not a pointer to a vtable for
37+
`Trait` that matches the actual dynamic trait the pointer or reference points to
38+
* slice metadata is invalid if the length is not a valid `usize`
39+
(i.e., it must not be read from uninitialized memory)
40+
* a `str` that isn't valid UTF-8
4241
* a type with custom invalid values that is one of those values, such as a
4342
`NonNull` that is null. (Requesting custom invalid values is an unstable
4443
feature, but some stable libstd types, like `NonNull`, make use of it.)
@@ -51,8 +50,10 @@ points to are part of the same allocation (so in particular they all have to be
5150
part of *some* allocation). The span of bytes it points to is determined by the
5251
pointer value and the size of the pointee type. As a consequence, if the span is
5352
empty, "dangling" is the same as "non-null". Note that slices point to their
54-
entire range, so it's very important that the length metadata is never too
55-
large. If for some reason this is too cumbersome, consider using raw pointers.
53+
entire range, so it's important that the length metadata is never too large
54+
(in particular, allocations and therefore slices cannot be bigger than
55+
`isize::MAX` bytes). If for some reason this is too cumbersome, consider using
56+
raw pointers.
5657

5758
That's it. That's all the causes of Undefined Behavior baked into Rust. Of
5859
course, unsafe functions and traits are free to declare arbitrary other

0 commit comments

Comments
 (0)