about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2020-10-28 09:05:45 +0100
committerRalf Jung <post@ralfj.de>2020-10-28 11:08:21 +0100
commitb0df3f76dc70eba57d6e0665fa6ccac89b25d3aa (patch)
tree6bfdb93558714179ed927f55d2c27555a305d6d1
parent824f900a96d752da2d882863c65f9736e5f2b347 (diff)
downloadrust-b0df3f76dc70eba57d6e0665fa6ccac89b25d3aa.tar.gz
rust-b0df3f76dc70eba57d6e0665fa6ccac89b25d3aa.zip
fix some incorrect aliasing in the BTree
-rw-r--r--library/alloc/src/collections/btree/node.rs12
1 files changed, 8 insertions, 4 deletions
diff --git a/library/alloc/src/collections/btree/node.rs b/library/alloc/src/collections/btree/node.rs
index c8d3de9e5cd..433074027e7 100644
--- a/library/alloc/src/collections/btree/node.rs
+++ b/library/alloc/src/collections/btree/node.rs
@@ -1608,15 +1608,19 @@ pub mod marker {
 
 unsafe fn slice_insert<T>(slice: &mut [T], idx: usize, val: T) {
     unsafe {
-        ptr::copy(slice.as_ptr().add(idx), slice.as_mut_ptr().add(idx + 1), slice.len() - idx);
-        ptr::write(slice.get_unchecked_mut(idx), val);
+        let len = slice.len();
+        let slice_ptr = slice.as_mut_ptr();
+        ptr::copy(slice_ptr.add(idx), slice_ptr.add(idx + 1), len - idx);
+        ptr::write(slice_ptr.add(idx), val);
     }
 }
 
 unsafe fn slice_remove<T>(slice: &mut [T], idx: usize) -> T {
     unsafe {
-        let ret = ptr::read(slice.get_unchecked(idx));
-        ptr::copy(slice.as_ptr().add(idx + 1), slice.as_mut_ptr().add(idx), slice.len() - idx - 1);
+        let len = slice.len();
+        let slice_ptr = slice.as_mut_ptr();
+        let ret = ptr::read(slice_ptr.add(idx));
+        ptr::copy(slice_ptr.add(idx + 1), slice_ptr.add(idx), len - idx - 1);
         ret
     }
 }