mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Implement split_at_spare_mut directly
The previous implementation used slice::as_mut_ptr_range to derive the pointer for the spare capacity slice. This is invalid, because that pointer is derived from the initialized region, so it does not have provenance over the uninitialized region.
This commit is contained in:
parent
daf2204aa4
commit
4f808161bc
@ -2141,12 +2141,15 @@ impl<T, A: Allocator> Vec<T, A> {
|
||||
unsafe fn split_at_spare_mut_with_len(
|
||||
&mut self,
|
||||
) -> (&mut [T], &mut [MaybeUninit<T>], &mut usize) {
|
||||
let Range { start: ptr, end: spare_ptr } = self.as_mut_ptr_range();
|
||||
let ptr = self.as_mut_ptr();
|
||||
// SAFETY:
|
||||
// - `ptr` is guaranteed to be valid for `self.len` elements
|
||||
let spare_ptr = unsafe { ptr.add(self.len) };
|
||||
let spare_ptr = spare_ptr.cast::<MaybeUninit<T>>();
|
||||
let spare_len = self.buf.capacity() - self.len;
|
||||
|
||||
// SAFETY:
|
||||
// - `ptr` is guaranteed to be valid for `len` elements
|
||||
// - `ptr` is guaranteed to be valid for `self.len` elements
|
||||
// - `spare_ptr` is pointing one element past the buffer, so it doesn't overlap with `initialized`
|
||||
unsafe {
|
||||
let initialized = slice::from_raw_parts_mut(ptr, self.len);
|
||||
|
Loading…
Reference in New Issue
Block a user