Skip to content

Commit 91ba92b

Browse files
committed
Change safety comment for usize with the one from LukasKalbertodt review
1 parent 5a0de2f commit 91ba92b

File tree

1 file changed

+17
-23
lines changed

1 file changed

+17
-23
lines changed

library/core/src/slice/mod.rs

+17-23
Original file line numberDiff line numberDiff line change
@@ -559,27 +559,24 @@ impl<T> [T] {
559559
// Use the llvm.bswap intrinsic to reverse u8s in a usize
560560
let chunk = mem::size_of::<usize>();
561561
while i + chunk - 1 < ln / 2 {
562-
// SAFETY: An unaligned usize can be read from `i` if `i + 1 < ln`
563-
// (and obviously `i < ln`), because each element is 1 byte and
564-
// we're reading `chunk`.
562+
// SAFETY:
565563
//
566-
// Since we checked for the `x86` and `x86_64` target before
567-
// getting here so `chunk` is at most 8 bytes.
568-
//
569-
// `i + chunk - 1 < ln / 2` # while condition
570-
// `i + 8 - 1 < ln / 2`
571-
// `i + 7 < ln / 2`
572-
// so obviously `i + 1 < ln / 2`
573-
//
574-
// Since it's less than the length divided by 2, then it must be
575-
// in bounds.
576-
//
577-
// This also means that the condition `0 < i + chunk <= ln` is
578-
// always respected, ensuring the `pb` pointer can be used
579-
// safely.
580-
//
581-
// Note: when updating this comment, update the others in the
582-
// function too.
564+
// - Note that `chunk` is either 4 or 8 due to the cfg check
565+
// above. So `chunk - 1` is positive.
566+
// - Indexing with index `i` is fine as the loop check guarantees
567+
// `i + chunk - 1 < ln / 2`
568+
// <=> `i < ln / 2 - (chunk - 1) < ln / 2 < ln`.
569+
// - Indexing with index `ln - i - chunk = ln - (i + chunk)` is fine:
570+
// - `i + chunk > 0` is trivially true.
571+
// - The loop check guarantees:
572+
// `i + chunk - 1 < ln / 2`
573+
// <=> `i + chunk ≤ ln / 2 ≤ ln`, thus subtraction does not underflow.
574+
// - The `read_unaligned` and `write_unaligned` calls are fine:
575+
// - `pa` points to index `i` where `i < ln / 2 - (chunk - 1)`
576+
// (see above) and `pb` points to index `ln - i - chunk`, so
577+
// both are at least `chunk`
578+
// many bytes away from the end of `self`.
579+
// - Any initialized memory is valid `usize`.
583580
unsafe {
584581
let pa: *mut T = self.get_unchecked_mut(i);
585582
let pb: *mut T = self.get_unchecked_mut(ln - i - chunk);
@@ -610,9 +607,6 @@ impl<T> [T] {
610607
// This also means that the condition `0 < i + chunk <= ln` is
611608
// always respected, ensuring the `pb` pointer can be used
612609
// safely.
613-
//
614-
// Note: when updating this comment, update the others in the
615-
// function too.
616610
unsafe {
617611
let pa: *mut T = self.get_unchecked_mut(i);
618612
let pb: *mut T = self.get_unchecked_mut(ln - i - chunk);

0 commit comments

Comments
 (0)