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] {
|
impl<T> Truncate for &mut [T] {
|
||||||
fn truncate(&mut self, len: usize) {
|
fn truncate(&mut self, len: usize) {
|
||||||
let mut value = core::mem::take(self);
|
let value = core::mem::take(self);
|
||||||
value = unsafe { value.get_unchecked_mut(..len) };
|
let len = value.len().min(len);
|
||||||
let _: &mut [T] = core::mem::replace(self, value);
|
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