Rollup merge of #131919 - RalfJung:zero-sized-accesses, r=jhpratt
zero-sized accesses are fine on null pointers We entirely forgot to update all the function docs when changing the central docs. That's the problem with helpfully repeating shared definitions in tons of places...
This commit is contained in:
commit
7a6d4368b7
3 changed files with 16 additions and 13 deletions
|
@ -3138,7 +3138,7 @@ pub const fn ptr_metadata<P: ptr::Pointee<Metadata = M> + ?Sized, M>(_ptr: *cons
|
||||||
/// [violate memory safety][read-ownership].
|
/// [violate memory safety][read-ownership].
|
||||||
///
|
///
|
||||||
/// Note that even if the effectively copied size (`count * size_of::<T>()`) is
|
/// Note that even if the effectively copied size (`count * size_of::<T>()`) is
|
||||||
/// `0`, the pointers must be non-null and properly aligned.
|
/// `0`, the pointers must be properly aligned.
|
||||||
///
|
///
|
||||||
/// [`read`]: crate::ptr::read
|
/// [`read`]: crate::ptr::read
|
||||||
/// [read-ownership]: crate::ptr::read#ownership-of-the-returned-value
|
/// [read-ownership]: crate::ptr::read#ownership-of-the-returned-value
|
||||||
|
@ -3261,7 +3261,7 @@ pub const unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: us
|
||||||
/// [violate memory safety][read-ownership].
|
/// [violate memory safety][read-ownership].
|
||||||
///
|
///
|
||||||
/// Note that even if the effectively copied size (`count * size_of::<T>()`) is
|
/// Note that even if the effectively copied size (`count * size_of::<T>()`) is
|
||||||
/// `0`, the pointers must be non-null and properly aligned.
|
/// `0`, the pointers must be properly aligned.
|
||||||
///
|
///
|
||||||
/// [`read`]: crate::ptr::read
|
/// [`read`]: crate::ptr::read
|
||||||
/// [read-ownership]: crate::ptr::read#ownership-of-the-returned-value
|
/// [read-ownership]: crate::ptr::read#ownership-of-the-returned-value
|
||||||
|
@ -3342,7 +3342,7 @@ pub const unsafe fn copy<T>(src: *const T, dst: *mut T, count: usize) {
|
||||||
/// * `dst` must be properly aligned.
|
/// * `dst` must be properly aligned.
|
||||||
///
|
///
|
||||||
/// Note that even if the effectively copied size (`count * size_of::<T>()`) is
|
/// Note that even if the effectively copied size (`count * size_of::<T>()`) is
|
||||||
/// `0`, the pointer must be non-null and properly aligned.
|
/// `0`, the pointer must be properly aligned.
|
||||||
///
|
///
|
||||||
/// Additionally, note that changing `*dst` in this way can easily lead to undefined behavior (UB)
|
/// Additionally, note that changing `*dst` in this way can easily lead to undefined behavior (UB)
|
||||||
/// later if the written bytes are not a valid representation of some `T`. For instance, the
|
/// later if the written bytes are not a valid representation of some `T`. For instance, the
|
||||||
|
|
|
@ -505,9 +505,11 @@ impl () {}
|
||||||
///
|
///
|
||||||
/// *[See also the `std::ptr` module](ptr).*
|
/// *[See also the `std::ptr` module](ptr).*
|
||||||
///
|
///
|
||||||
/// Working with raw pointers in Rust is uncommon, typically limited to a few patterns.
|
/// Working with raw pointers in Rust is uncommon, typically limited to a few patterns. Raw pointers
|
||||||
/// Raw pointers can be unaligned or [`null`]. However, when a raw pointer is
|
/// can be out-of-bounds, unaligned, or [`null`]. However, when loading from or storing to a raw
|
||||||
/// dereferenced (using the `*` operator), it must be non-null and aligned.
|
/// pointer, it must be [valid] for the given access and aligned. When using a field expression,
|
||||||
|
/// tuple index expression, or array/slice index expression on a raw pointer, it follows the rules
|
||||||
|
/// of [in-bounds pointer arithmetic][`offset`].
|
||||||
///
|
///
|
||||||
/// Storing through a raw pointer using `*ptr = data` calls `drop` on the old value, so
|
/// Storing through a raw pointer using `*ptr = data` calls `drop` on the old value, so
|
||||||
/// [`write`] must be used if the type has drop glue and memory is not already
|
/// [`write`] must be used if the type has drop glue and memory is not already
|
||||||
|
@ -613,6 +615,7 @@ impl () {}
|
||||||
/// [`offset`]: pointer::offset
|
/// [`offset`]: pointer::offset
|
||||||
/// [`into_raw`]: ../std/boxed/struct.Box.html#method.into_raw
|
/// [`into_raw`]: ../std/boxed/struct.Box.html#method.into_raw
|
||||||
/// [`write`]: ptr::write
|
/// [`write`]: ptr::write
|
||||||
|
/// [valid]: ptr#safety
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
mod prim_pointer {}
|
mod prim_pointer {}
|
||||||
|
|
||||||
|
|
|
@ -1024,7 +1024,7 @@ pub const fn slice_from_raw_parts_mut<T>(data: *mut T, len: usize) -> *mut [T] {
|
||||||
///
|
///
|
||||||
/// * Both `x` and `y` must be properly aligned.
|
/// * Both `x` and `y` must be properly aligned.
|
||||||
///
|
///
|
||||||
/// Note that even if `T` has size `0`, the pointers must be non-null and properly aligned.
|
/// Note that even if `T` has size `0`, the pointers must be properly aligned.
|
||||||
///
|
///
|
||||||
/// [valid]: self#safety
|
/// [valid]: self#safety
|
||||||
///
|
///
|
||||||
|
@ -1110,7 +1110,7 @@ pub const unsafe fn swap<T>(x: *mut T, y: *mut T) {
|
||||||
/// beginning at `y` with the same size.
|
/// beginning at `y` with the same size.
|
||||||
///
|
///
|
||||||
/// Note that even if the effectively copied size (`count * size_of::<T>()`) is `0`,
|
/// Note that even if the effectively copied size (`count * size_of::<T>()`) is `0`,
|
||||||
/// the pointers must be non-null and properly aligned.
|
/// the pointers must be properly aligned.
|
||||||
///
|
///
|
||||||
/// [valid]: self#safety
|
/// [valid]: self#safety
|
||||||
///
|
///
|
||||||
|
@ -1243,7 +1243,7 @@ const unsafe fn swap_nonoverlapping_simple_untyped<T>(x: *mut T, y: *mut T, coun
|
||||||
///
|
///
|
||||||
/// * `dst` must point to a properly initialized value of type `T`.
|
/// * `dst` must point to a properly initialized value of type `T`.
|
||||||
///
|
///
|
||||||
/// Note that even if `T` has size `0`, the pointer must be non-null and properly aligned.
|
/// Note that even if `T` has size `0`, the pointer must be properly aligned.
|
||||||
///
|
///
|
||||||
/// [valid]: self#safety
|
/// [valid]: self#safety
|
||||||
///
|
///
|
||||||
|
@ -1300,7 +1300,7 @@ pub const unsafe fn replace<T>(dst: *mut T, src: T) -> T {
|
||||||
///
|
///
|
||||||
/// * `src` must point to a properly initialized value of type `T`.
|
/// * `src` must point to a properly initialized value of type `T`.
|
||||||
///
|
///
|
||||||
/// Note that even if `T` has size `0`, the pointer must be non-null and properly aligned.
|
/// Note that even if `T` has size `0`, the pointer must be properly aligned.
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
|
@ -1555,7 +1555,7 @@ pub const unsafe fn read_unaligned<T>(src: *const T) -> T {
|
||||||
/// * `dst` must be properly aligned. Use [`write_unaligned`] if this is not the
|
/// * `dst` must be properly aligned. Use [`write_unaligned`] if this is not the
|
||||||
/// case.
|
/// case.
|
||||||
///
|
///
|
||||||
/// Note that even if `T` has size `0`, the pointer must be non-null and properly aligned.
|
/// Note that even if `T` has size `0`, the pointer must be properly aligned.
|
||||||
///
|
///
|
||||||
/// [valid]: self#safety
|
/// [valid]: self#safety
|
||||||
///
|
///
|
||||||
|
@ -1774,7 +1774,7 @@ pub const unsafe fn write_unaligned<T>(dst: *mut T, src: T) {
|
||||||
/// However, storing non-[`Copy`] types in volatile memory is almost certainly
|
/// However, storing non-[`Copy`] types in volatile memory is almost certainly
|
||||||
/// incorrect.
|
/// incorrect.
|
||||||
///
|
///
|
||||||
/// Note that even if `T` has size `0`, the pointer must be non-null and properly aligned.
|
/// Note that even if `T` has size `0`, the pointer must be properly aligned.
|
||||||
///
|
///
|
||||||
/// [valid]: self#safety
|
/// [valid]: self#safety
|
||||||
/// [read-ownership]: read#ownership-of-the-returned-value
|
/// [read-ownership]: read#ownership-of-the-returned-value
|
||||||
|
@ -1853,7 +1853,7 @@ pub unsafe fn read_volatile<T>(src: *const T) -> T {
|
||||||
///
|
///
|
||||||
/// * `dst` must be properly aligned.
|
/// * `dst` must be properly aligned.
|
||||||
///
|
///
|
||||||
/// Note that even if `T` has size `0`, the pointer must be non-null and properly aligned.
|
/// Note that even if `T` has size `0`, the pointer must be properly aligned.
|
||||||
///
|
///
|
||||||
/// [valid]: self#safety
|
/// [valid]: self#safety
|
||||||
///
|
///
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue