diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-09-05 20:15:01 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-05 20:15:01 +0200 |
| commit | 14c57f1adb9b1bbd643ab20a2ec256362f145022 (patch) | |
| tree | 5bc71d0555d13b73c9bf598748f157f3788b6272 | |
| parent | ab45885dec2a6552cb060a5b7183653baaecd580 (diff) | |
| parent | 4684ffaf2ac5c7bb1467baf4e7f01469488c8ef2 (diff) | |
| download | rust-14c57f1adb9b1bbd643ab20a2ec256362f145022.tar.gz rust-14c57f1adb9b1bbd643ab20a2ec256362f145022.zip | |
Rollup merge of #114794 - RalfJung:swap-safety, r=m-ou-se
clarify safety documentation of ptr::swap and ptr::copy Closes https://github.com/rust-lang/rust/issues/81005
| -rw-r--r-- | library/core/src/intrinsics.rs | 8 | ||||
| -rw-r--r-- | library/core/src/ptr/mod.rs | 4 |
2 files changed, 9 insertions, 3 deletions
diff --git a/library/core/src/intrinsics.rs b/library/core/src/intrinsics.rs index 5a9c900f643..4c76662ac09 100644 --- a/library/core/src/intrinsics.rs +++ b/library/core/src/intrinsics.rs @@ -2707,9 +2707,13 @@ pub const unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: us /// /// Behavior is undefined if any of the following conditions are violated: /// -/// * `src` must be [valid] for reads of `count * size_of::<T>()` bytes. +/// * `src` must be [valid] for reads of `count * size_of::<T>()` bytes, and must remain valid even +/// when `dst` is written for `count * size_of::<T>()` bytes. (This means if the memory ranges +/// overlap, the two pointers must not be subject to aliasing restrictions relative to each +/// other.) /// -/// * `dst` must be [valid] for writes of `count * size_of::<T>()` bytes. +/// * `dst` must be [valid] for writes of `count * size_of::<T>()` bytes, and must remain valid even +/// when `src` is read for `count * size_of::<T>()` bytes. /// /// * Both `src` and `dst` must be properly aligned. /// diff --git a/library/core/src/ptr/mod.rs b/library/core/src/ptr/mod.rs index 01e36044899..41e67fd8435 100644 --- a/library/core/src/ptr/mod.rs +++ b/library/core/src/ptr/mod.rs @@ -795,7 +795,9 @@ pub const fn slice_from_raw_parts_mut<T>(data: *mut T, len: usize) -> *mut [T] { /// /// Behavior is undefined if any of the following conditions are violated: /// -/// * Both `x` and `y` must be [valid] for both reads and writes. +/// * Both `x` and `y` must be [valid] for both reads and writes. They must remain valid even when the +/// other pointer is written. (This means if the memory ranges overlap, the two pointers must not +/// be subject to aliasing restrictions relative to each other.) /// /// * Both `x` and `y` must be properly aligned. /// |
