diff options
| author | Ralf Jung <post@ralfj.de> | 2025-06-07 21:57:45 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2025-06-07 21:57:45 +0200 |
| commit | bd0a81ee82bbc9e7e163bab648c86170cf816c5e (patch) | |
| tree | 1c73e2d7df4de2bc7cceef0214162c331758ab71 | |
| parent | bafe406711a4e7e9e2683d9245fcc13f306e1d83 (diff) | |
| download | rust-bd0a81ee82bbc9e7e163bab648c86170cf816c5e.tar.gz rust-bd0a81ee82bbc9e7e163bab648c86170cf816c5e.zip | |
centralize aliasing rules discussion in UnsafeCell docs
| -rw-r--r-- | library/core/src/cell.rs | 16 | ||||
| -rw-r--r-- | library/core/src/pin/unsafe_pinned.rs | 10 |
2 files changed, 11 insertions, 15 deletions
diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs index 0656ab98ee3..a4b6efe35fc 100644 --- a/library/core/src/cell.rs +++ b/library/core/src/cell.rs @@ -1914,6 +1914,8 @@ impl<T: ?Sized + fmt::Display> fmt::Display for RefMut<'_, T> { /// [`.get()`]: `UnsafeCell::get` /// [concurrent memory model]: ../sync/atomic/index.html#memory-model-for-atomic-accesses /// +/// # Aliasing rules +/// /// The precise Rust aliasing rules are somewhat in flux, but the main points are not contentious: /// /// - If you create a safe reference with lifetime `'a` (either a `&T` or `&mut T` reference), then @@ -2167,10 +2169,9 @@ impl<T: ?Sized> UnsafeCell<T> { /// Gets a mutable pointer to the wrapped value. /// - /// This can be cast to a pointer of any kind. - /// Ensure that the access is unique (no active references, mutable or not) - /// when casting to `&mut T`, and ensure that there are no mutations - /// or mutable aliases going on when casting to `&T`. + /// This can be cast to a pointer of any kind. When creating references, you must uphold the + /// aliasing rules; see [the type-level docs][UnsafeCell#aliasing-rules] for more discussion and + /// caveats. /// /// # Examples /// @@ -2219,10 +2220,9 @@ impl<T: ?Sized> UnsafeCell<T> { /// The difference from [`get`] is that this function accepts a raw pointer, /// which is useful to avoid the creation of temporary references. /// - /// The result can be cast to a pointer of any kind. - /// Ensure that the access is unique (no active references, mutable or not) - /// when casting to `&mut T`, and ensure that there are no mutations - /// or mutable aliases going on when casting to `&T`. + /// This can be cast to a pointer of any kind. When creating references, you must uphold the + /// aliasing rules; see [the type-level docs][UnsafeCell#aliasing-rules] for more discussion and + /// caveats. /// /// [`get`]: UnsafeCell::get() /// diff --git a/library/core/src/pin/unsafe_pinned.rs b/library/core/src/pin/unsafe_pinned.rs index f3d5e079838..17f7bcd306b 100644 --- a/library/core/src/pin/unsafe_pinned.rs +++ b/library/core/src/pin/unsafe_pinned.rs @@ -88,14 +88,10 @@ impl<T: ?Sized> UnsafePinned<T> { /// Get mutable access to the contents of a shared `UnsafePinned`. /// - /// This can be cast to a pointer of any kind. - /// Ensure that the access is unique (no active references, mutable or not) - /// when casting to `&mut T`, and ensure that there are no mutations - /// or mutable aliases going on when casting to `&T`. + /// This can be cast to a pointer of any kind. When creating references, you must uphold the + /// aliasing rules; see [`UnsafeCell`] for more discussion and caveats. /// - /// All the usual caveats around mutation shared state apply, see [`UnsafeCell`]. - /// - /// [`UnsafeCell`]: crate::cell::UnsafeCell + /// [`UnsafeCell`]: crate::cell::UnsafeCell#aliasing-rules /// /// ```rust,no_run /// #![feature(unsafe_pinned)] |
