Vec backing buffer leaks on panic during `into_iter`
RalfJung opened this issue · 0 comments
RalfJung commented
When running the test_into_iter_leak
test in Miri, it complains about a memory leak:
note: created allocation with id 228443
--> /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/src/liballoc/alloc.rs:81:47
|
81 | __rust_alloc(layout.size(), layout.align())
| ^ created allocation with id 228443
|
= note: inside call to `std::alloc::alloc` at /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/src/liballoc/alloc.rs:169:22
= note: inside call to `<std::alloc::Global as std::alloc::AllocRef>::alloc` at /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/src/liballoc/alloc.rs:203:15
note: inside call to `alloc::alloc::exchange_malloc` at <::alloc::macros::vec macros>:2:46
--> alloc_miri_test/../liballoc/tests/vec.rs:786:13
|
786 | let v = vec![D(false), D(true), D(false)];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: inside call to `vec::test_into_iter_leak` at alloc_miri_test/../liballoc/tests/vec.rs:769:1
--> alloc_miri_test/../liballoc/tests/vec.rs:769:1
|
769 | / fn test_into_iter_leak() {
770 | | static mut DROPS: i32 = 0;
771 | |
772 | | struct D(bool);
... |
790 | | assert_eq!(unsafe { DROPS }, 3);
791 | | }
| |_^
### LEAK REPORT ###
Alloc 228443: 00 01 00 (3 bytes, alignment 1) (Rust)
Given that the leaked allocation contains "00 01 00", that seems a lot like the backing store of a Vec
with initial content D(false), D(true), D(false)
.