clarify rules for ZST Boxes

This commit is contained in:
Ralf Jung
2020-10-12 10:08:25 +02:00
parent 06a079c43e
commit c555aabc5b
2 changed files with 14 additions and 2 deletions

View File

@@ -16,12 +16,15 @@
//! provided at this point are very minimal:
//!
//! * A [null] pointer is *never* valid, not even for accesses of [size zero][zst].
//! * All pointers (except for the null pointer) are valid for all operations of
//! [size zero][zst].
//! * For a pointer to be valid, it is necessary, but not always sufficient, that the pointer
//! be *dereferenceable*: the memory range of the given size starting at the pointer must all be
//! within the bounds of a single allocated object. Note that in Rust,
//! every (stack-allocated) variable is considered a separate allocated object.
//! * Even for operations of [size zero][zst], the pointer must not be "dangling" in the sense of
//! pointing to deallocated memory. However, casting any non-zero integer to a pointer is valid
//! for zero-sized accesses. This corresponds to writing your own allocator; allocating zero-sized
//! objects is not very hard. In contrast, when you use the standard allocator, after memory got
//! deallocated, even zero-sized accesses to that memory are invalid.
//! * All accesses performed by functions in this module are *non-atomic* in the sense
//! of [atomic operations] used to synchronize between threads. This means it is
//! undefined behavior to perform two concurrent accesses to the same location from different