bolts: Fix UB in Truncate trait (#3207)

* bolts: Fix UB in Truncate trait

* fix test

* rename test

* fmt
This commit is contained in:
Dominik Maier 2025-05-09 20:09:29 +02:00 committed by GitHub
parent 58bdbd293a
commit 87bd8a6c73
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -97,9 +97,12 @@ impl<T> Truncate for &[T] {
impl<T> Truncate for &mut [T] {
fn truncate(&mut self, len: usize) {
let mut value = core::mem::take(self);
value = unsafe { value.get_unchecked_mut(..len) };
let _: &mut [T] = core::mem::replace(self, value);
let value = core::mem::take(self);
let len = value.len().min(len);
let truncated = value
.get_mut(..len)
.expect("Truncate with len <= len() should always work");
let _: &mut [T] = core::mem::replace(self, truncated);
}
}
@ -1232,3 +1235,26 @@ where
}
}
}
#[cfg(test)]
mod test {
use crate::Truncate;
#[test]
fn test_truncate() {
let mut data = [0; 1024];
let mut slice = &mut data as &mut [_];
slice.truncate(1);
assert_eq!(0, slice[0]);
assert_eq!(1, slice.len());
slice.truncate(100);
assert_eq!(0, slice[0]);
assert_eq!(1, slice.len());
slice.truncate(0);
slice.truncate(100);
assert_eq!(0, slice.len());
}
}