Skip to content

Commit 5639d97

Browse files
authored
Rollup merge of #78476 - RalfJung:btree-alias, r=Mark-Simulacrum
fix some incorrect aliasing in the BTree This line is wrong: ``` ptr::copy(slice.as_ptr().add(idx), slice.as_mut_ptr().add(idx + 1), slice.len() - idx); ``` When `slice.as_mut_ptr()` is called, that creates a mutable reference to the entire slice, which invalidates the raw pointer previously returned by `slice.as_ptr()`. (Miri currently misses this because raw pointers are not tracked properly.) Cc ````````@ssomers````````
2 parents 4e5b7ad + b0df3f7 commit 5639d97

File tree

1 file changed

+8
-4
lines changed
  • library/alloc/src/collections/btree

1 file changed

+8
-4
lines changed

library/alloc/src/collections/btree/node.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -1608,15 +1608,19 @@ pub mod marker {
16081608

16091609
unsafe fn slice_insert<T>(slice: &mut [T], idx: usize, val: T) {
16101610
unsafe {
1611-
ptr::copy(slice.as_ptr().add(idx), slice.as_mut_ptr().add(idx + 1), slice.len() - idx);
1612-
ptr::write(slice.get_unchecked_mut(idx), val);
1611+
let len = slice.len();
1612+
let slice_ptr = slice.as_mut_ptr();
1613+
ptr::copy(slice_ptr.add(idx), slice_ptr.add(idx + 1), len - idx);
1614+
ptr::write(slice_ptr.add(idx), val);
16131615
}
16141616
}
16151617

16161618
unsafe fn slice_remove<T>(slice: &mut [T], idx: usize) -> T {
16171619
unsafe {
1618-
let ret = ptr::read(slice.get_unchecked(idx));
1619-
ptr::copy(slice.as_ptr().add(idx + 1), slice.as_mut_ptr().add(idx), slice.len() - idx - 1);
1620+
let len = slice.len();
1621+
let slice_ptr = slice.as_mut_ptr();
1622+
let ret = ptr::read(slice_ptr.add(idx));
1623+
ptr::copy(slice_ptr.add(idx + 1), slice_ptr.add(idx), len - idx - 1);
16201624
ret
16211625
}
16221626
}

0 commit comments

Comments
 (0)