Vec drop and truncate: drop using raw slice *mut [T]
By creating a *mut [T] directly (without going through &mut [T]), avoid
questions of validity of the contents of the slice.
Consider the following risky code:
```rust
unsafe {
let mut v = Vec::<bool>::with_capacity(16);
v.set_len(16);
}
```
The intention is that with this change, the above snippet will be
sound because Vec::drop does no longer produces a mutable slice of
the vector's contents.
This commit is contained in:
parent
6805906fba
commit
7612ad7797
1 changed files with 2 additions and 2 deletions
|
|
@ -741,7 +741,7 @@ impl<T> Vec<T> {
|
|||
return;
|
||||
}
|
||||
let remaining_len = self.len - len;
|
||||
let s = slice::from_raw_parts_mut(self.as_mut_ptr().add(len), remaining_len);
|
||||
let s = ptr::slice_from_raw_parts_mut(self.as_mut_ptr().add(len), remaining_len);
|
||||
self.len = len;
|
||||
ptr::drop_in_place(s);
|
||||
}
|
||||
|
|
@ -2379,7 +2379,7 @@ unsafe impl<#[may_dangle] T> Drop for Vec<T> {
|
|||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
// use drop for [T]
|
||||
ptr::drop_in_place(&mut self[..]);
|
||||
ptr::drop_in_place(ptr::slice_from_raw_parts_mut(self.as_mut_ptr(), self.len))
|
||||
}
|
||||
// RawVec handles deallocation
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue