File tree Expand file tree Collapse file tree 1 file changed +11
-1
lines changed Expand file tree Collapse file tree 1 file changed +11
-1
lines changed Original file line number Diff line number Diff line change 35
35
//! be used for inter-thread synchronization.
36
36
//! * The result of casting a reference to a pointer is valid for as long as the
37
37
//! underlying object is live and no reference (just raw pointers) is used to
38
- //! access the same memory.
38
+ //! access the same memory. That is, reference and pointer accesses cannot be
39
+ //! interleaved—they must follow stacked borrows.
39
40
//!
40
41
//! These axioms, along with careful use of [`offset`] for pointer arithmetic,
41
42
//! are enough to correctly implement many useful things in unsafe code. Stronger guarantees
64
65
//! separate allocated object), heap allocations (each allocation created by the global allocator is
65
66
//! a separate allocated object), and `static` variables.
66
67
//!
68
+ //! ## A note on read vs. write invariants
69
+ //!
70
+ //! Both the pointer and the pointee's invariants must be satisfied when reading from a pointer,
71
+ //! but only the pointer's invariants must be satisfied when writing. It is not considered UB to write
72
+ //! data that violates a type's invariants so long as the type's invariants are satisfied by the time
73
+ //! it is read, either through the raw pointer or the reference it originated from. This means a type
74
+ //! may freely transition between valid and invalid states when being written to by raw pointers.
75
+ //! Thus, when discussing safety, it may be useful to separately assert the validity of the pointer vs.
76
+ //! the validity of the data it points to.
67
77
//!
68
78
//! # Strict Provenance
69
79
//!
You can’t perform that action at this time.
0 commit comments