@@ -16,10 +16,9 @@ to your program. You definitely *should not* invoke Undefined Behavior.
1616Unlike C, Undefined Behavior is pretty limited in scope in Rust. All the core
1717language 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
5150part of * some* allocation). The span of bytes it points to is determined by the
5251pointer value and the size of the pointee type. As a consequence, if the span is
5352empty, "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
5758That's it. That's all the causes of Undefined Behavior baked into Rust. Of
5859course, unsafe functions and traits are free to declare arbitrary other
0 commit comments