@@ -23,44 +23,56 @@ code.
2323</div >
2424
2525*  Data races.
26- *  Dereferencing a null or dangling raw pointer.
27- *  Unaligned pointer reading and writing outside of [ ` read_unaligned ` ] 
28-   and [ ` write_unaligned ` ] .
29- *  Reads of [ undef]  \( uninitialized) memory.
30- *  Breaking the [ pointer aliasing rules]  on accesses through raw pointers;
31-   a subset of the rules used by C.
32- *  ` &mut T `  and ` &T `  follow LLVM’s scoped [ noalias]  model, except if the ` &T ` 
33-   contains an [ ` UnsafeCell<U> ` ] .
34- *  Mutating non-mutable data &mdash ;  that is, data reached through a shared
26+ *  Dereferencing (using the ` * `  operator on) a dangling or unaligned raw pointer.
27+ *  Breaking the [ pointer aliasing rules] . ` &mut T `  and ` &T `  follow LLVM’s scoped
28+   [ noalias]  model, except if the ` &T `  contains an [ ` UnsafeCell<U> ` ] .
29+ *  Mutating non-mutable data (that is, data reached through a shared
3530  reference or data owned by a ` let `  binding), unless that data is contained
3631  within an [ ` UnsafeCell<U> ` ] .
37- *  Invoking undefined behavior via compiler intrinsics:
38-   *  Indexing outside of the bounds of an object with [ ` offset ` ]  with
39-     the exception of one byte past the end of the object.
40-   *  Using [ ` std::ptr::copy_nonoverlapping_memory ` ] , a.k.a. the ` memcpy32 ` and
41-     ` memcpy64 `  intrinsics, on overlapping buffers.
42- *  Invalid values in primitive types, even in private fields and locals:
43-   *  Dangling or null references and boxes.
32+ *  Invoking undefined behavior via compiler intrinsics.
33+ *  Executing code compiled with platform features that the current platform
34+   does not support (see [ ` target_feature ` ] ).
35+ *  Unwinding into another language.
36+ *  Producing an invalid value, even in private fields and locals. "Producing" a
37+   value happens any time a value is assigned, passed to a function/primitive
38+   operation or returned from a function/primitive operation.
39+   The following values are invalid (at their respective type):
4440  *  A value other than ` false `  (` 0 ` ) or ` true `  (` 1 ` ) in a ` bool ` .
4541  *  A discriminant in an ` enum `  not included in the type definition.
42+   *  A null ` fn `  pointer.
4643  *  A value in a ` char `  which is a surrogate or above ` char::MAX ` .
44+   *  A ` ! `  (all values are invalid for this type).
45+   *  A dangling or unaligned reference or ` Box ` , or one that points to an invalid value.
46+   *  Invalid metadata in a wide reference, ` Box `  or raw pointer:
47+     *  slice metadata is invalid if the slice has a total size larger than
48+       ` isize::MAX `  bytes in memory.
49+     *  ` dyn Trait `  metadata is invalid if it is not a pointer to a vtable for
50+       ` Trait `  that matches the actual dynamic trait the reference points to.
4751  *  Non-UTF-8 byte sequences in a ` str ` .
48- *  Executing code compiled with platform features that the current platform
49-   does not support (see [ ` target_feature ` ] ).
52+   *  [ Uninitialized memory] [ undef ]  in the value of an integer (` i* ` /` u* ` ),
53+     floating point value (` f* ` ), or raw pointer.
54+   *  Invalid values for a type with a custom definition of invalid values, such
55+     as a ` NonNull `  that is null. (Requesting custom invalid values is an
56+     unstable feature, but some stable libstd types, like ` NonNull ` , make use of
57+     it.)
5058
5159>  ** Note** : Undefined behavior affects the entire program. For example, calling
5260>  a function in C that exhibits undefined behavior of C means your entire
5361>  program contains undefined behaviour that can also affect the Rust code. And
5462>  vice versa, undefined behavior in Rust can cause adverse affects on code
5563>  executed by any FFI calls to other languages.
5664
65+ A reference/pointer is "dangling" if it is null or not all of the bytes it
66+ points to are part of the same allocation (so in particular they all have to be
67+ part of * some*  allocation). The span of bytes it points to is determined by the
68+ pointer value and the size of the pointee type. As a consequence, if the span is
69+ empty, "dangling" is the same as "non-null". Note that slices point to their
70+ entire range, so it is very important that the length metadata is never too
71+ large.
72+ 
5773[ noalias ] : http://llvm.org/docs/LangRef.html#noalias 
5874[ pointer aliasing rules ] : http://llvm.org/docs/LangRef.html#pointer-aliasing-rules 
5975[ undef ] : http://llvm.org/docs/LangRef.html#undefined-values 
60- [ `offset` ] : ../std/primitive.pointer.html#method.offset 
61- [ `std::ptr::copy_nonoverlapping_memory` ] : ../std/ptr/fn.copy_nonoverlapping.html 
6276[ `target_feature` ] : attributes/codegen.md#the-target_feature-attribute 
6377[ `UnsafeCell<U>` ] : ../std/cell/struct.UnsafeCell.html 
64- [ `read_unaligned` ] : ../std/ptr/fn.read_unaligned.html 
65- [ `write_unaligned` ] : ../std/ptr/fn.write_unaligned.html 
6678[ Rustonomicon ] : ../nomicon/index.html 
0 commit comments