diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-11-20 18:21:48 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-20 18:21:48 +0100 |
| commit | db5f005f35ee8abdf772d518fea09fcadd97fb43 (patch) | |
| tree | 05543385b1c9ac898b95f27cad01361726721bdf | |
| parent | 820a41580efb5c67df02dc511c2465d71b0e9f61 (diff) | |
| parent | d26659d61153922fdd44485b409747566661a674 (diff) | |
| download | rust-db5f005f35ee8abdf772d518fea09fcadd97fb43.tar.gz rust-db5f005f35ee8abdf772d518fea09fcadd97fb43.zip | |
Rollup merge of #104568 - RalfJung:realloc, r=Amanieu
clarify that realloc refreshes pointer provenance even when the allocation remains in-place This [matches what C does](https://en.cppreference.com/w/c/memory/realloc): > The original pointer ptr is invalidated and any access to it is undefined behavior (even if reallocation was in-place). Cc `@rust-lang/wg-allocators`
| -rw-r--r-- | library/core/src/alloc/global.rs | 8 | ||||
| -rw-r--r-- | library/core/src/alloc/mod.rs | 10 |
2 files changed, 11 insertions, 7 deletions
diff --git a/library/core/src/alloc/global.rs b/library/core/src/alloc/global.rs index 6756eecd0e0..1d80b8bf9ec 100644 --- a/library/core/src/alloc/global.rs +++ b/library/core/src/alloc/global.rs @@ -208,9 +208,11 @@ pub unsafe trait GlobalAlloc { /// /// If this returns a non-null pointer, then ownership of the memory block /// referenced by `ptr` has been transferred to this allocator. - /// The memory may or may not have been deallocated, and should be - /// considered unusable. The new memory block is allocated with `layout`, - /// but with the `size` updated to `new_size`. This new layout should be + /// Any access to the old `ptr` is Undefined Behavior, even if the + /// allocation remained in-place. The newly returned pointer is the only valid pointer + /// for accessing this memory now. + /// The new memory block is allocated with `layout`, + /// but with the `size` updated to `new_size`. This new layout must be /// used when deallocating the new memory block with `dealloc`. The range /// `0..min(layout.size(), new_size)` of the new memory block is /// guaranteed to have the same values as the original block. diff --git a/library/core/src/alloc/mod.rs b/library/core/src/alloc/mod.rs index a4bf6a853a6..a6082455fac 100644 --- a/library/core/src/alloc/mod.rs +++ b/library/core/src/alloc/mod.rs @@ -169,8 +169,9 @@ pub unsafe trait Allocator { /// this, the allocator may extend the allocation referenced by `ptr` to fit the new layout. /// /// If this returns `Ok`, then ownership of the memory block referenced by `ptr` has been - /// transferred to this allocator. The memory may or may not have been freed, and should be - /// considered unusable. + /// transferred to this allocator. Any access to the old `ptr` is Undefined Behavior, even if the + /// allocation was grown in-place. The newly returned pointer is the only valid pointer + /// for accessing this memory now. /// /// If this method returns `Err`, then ownership of the memory block has not been transferred to /// this allocator, and the contents of the memory block are unaltered. @@ -295,8 +296,9 @@ pub unsafe trait Allocator { /// this, the allocator may shrink the allocation referenced by `ptr` to fit the new layout. /// /// If this returns `Ok`, then ownership of the memory block referenced by `ptr` has been - /// transferred to this allocator. The memory may or may not have been freed, and should be - /// considered unusable. + /// transferred to this allocator. Any access to the old `ptr` is Undefined Behavior, even if the + /// allocation was shrunk in-place. The newly returned pointer is the only valid pointer + /// for accessing this memory now. /// /// If this method returns `Err`, then ownership of the memory block has not been transferred to /// this allocator, and the contents of the memory block are unaltered. |
