bolts: Fix UB in Truncate trait (#3207)
* bolts: Fix UB in Truncate trait * fix test * rename test * fmt
This commit is contained in:
parent
58bdbd293a
commit
87bd8a6c73
@ -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());
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user