Skip to content

Commit 23d8276

Browse files
committed
<[T]>::reverse: Fix pointer provenance rules
1 parent dc06a36 commit 23d8276

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

Diff for: library/core/src/slice/mod.rs

+9-6
Original file line numberDiff line numberDiff line change
@@ -605,8 +605,9 @@ impl<T> [T] {
605605
// many bytes away from the end of `self`.
606606
// - Any initialized memory is valid `usize`.
607607
unsafe {
608-
let pa: *mut T = self.get_unchecked_mut(i);
609-
let pb: *mut T = self.get_unchecked_mut(ln - i - chunk);
608+
let ptr = self.as_mut_ptr();
609+
let pa = ptr.add(i);
610+
let pb = ptr.add(ln - i - chunk);
610611
let va = ptr::read_unaligned(pa as *mut usize);
611612
let vb = ptr::read_unaligned(pb as *mut usize);
612613
ptr::write_unaligned(pa as *mut usize, vb.swap_bytes());
@@ -635,8 +636,9 @@ impl<T> [T] {
635636
// always respected, ensuring the `pb` pointer can be used
636637
// safely.
637638
unsafe {
638-
let pa: *mut T = self.get_unchecked_mut(i);
639-
let pb: *mut T = self.get_unchecked_mut(ln - i - chunk);
639+
let ptr = self.as_mut_ptr();
640+
let pa = ptr.add(i);
641+
let pb = ptr.add(ln - i - chunk);
640642
let va = ptr::read_unaligned(pa as *mut u32);
641643
let vb = ptr::read_unaligned(pb as *mut u32);
642644
ptr::write_unaligned(pa as *mut u32, vb.rotate_left(16));
@@ -654,8 +656,9 @@ impl<T> [T] {
654656
// aligned, and can be read from and written to.
655657
unsafe {
656658
// Unsafe swap to avoid the bounds check in safe swap.
657-
let pa: *mut T = self.get_unchecked_mut(i);
658-
let pb: *mut T = self.get_unchecked_mut(ln - i - 1);
659+
let ptr = self.as_mut_ptr();
660+
let pa = ptr.add(i);
661+
let pb = ptr.add(ln - i - 1);
659662
ptr::swap(pa, pb);
660663
}
661664
i += 1;

0 commit comments

Comments
 (0)