add a test demonstrating double-free in extend() for ZSTs
This commit is contained in:
committed by
bluss
parent
812c83a2b1
commit
0ff49b9614
@@ -716,6 +716,32 @@ fn test_extend_zst() {
|
|||||||
assert_eq!(array.len(), 5);
|
assert_eq!(array.len(), 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_extend_zst_with_drop_is_not_dropped_twice_via_safe_api() {
|
||||||
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
|
||||||
|
static DROP_COUNT: AtomicUsize = AtomicUsize::new(0);
|
||||||
|
|
||||||
|
struct ZstWithSafeDrop;
|
||||||
|
|
||||||
|
impl Drop for ZstWithSafeDrop {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
let previous = DROP_COUNT.fetch_add(1, Ordering::SeqCst);
|
||||||
|
// Extending with a single ZST moves one logical value into the ArrayVec.
|
||||||
|
// Its Drop implementation must run exactly once, when the ArrayVec drops.
|
||||||
|
if previous != 0 {
|
||||||
|
panic!("ZST value dropped more than once");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DROP_COUNT.store(0, Ordering::SeqCst);
|
||||||
|
|
||||||
|
let mut vec = ArrayVec::<ZstWithSafeDrop, 1>::new();
|
||||||
|
vec.extend(std::iter::once(ZstWithSafeDrop));
|
||||||
|
drop(vec);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_try_from_argument() {
|
fn test_try_from_argument() {
|
||||||
use core::convert::TryFrom;
|
use core::convert::TryFrom;
|
||||||
|
|||||||
Reference in New Issue
Block a user