Occasional memory leak in mpsc channels · Issue #121582 · rust-lang/rust (original) (raw)
Running this test:
use std::sync::mpsc::channel; use std::thread;
fn main() { let (tx, rx) = channel::(); let _t = thread::spawn(move || { drop(rx); }); let _ = thread::spawn(move || { tx.send(1).unwrap(); }) .join(); }
with many different seeds in Miri eventually shows:
error: memory leaked: alloc2567 (Rust heap, size: 504, align: 8), allocated here:
--> /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/library/alloc/src/alloc.rs:98:9
|
98 | __rust_alloc(layout.size(), layout.align())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: inside std::alloc::alloc
at /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/library/alloc/src/alloc.rs:98:9: 98:52
= note: inside std::alloc::Global::alloc_impl
at /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/library/alloc/src/alloc.rs:181:73: 181:86
= note: inside <std::alloc::Global as std::alloc::Allocator>::allocate
at /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/library/alloc/src/alloc.rs:241:9: 241:39
= note: inside alloc::alloc::exchange_malloc
at /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/library/alloc/src/alloc.rs:330:11: 330:34
= note: inside std::boxed::Box::<std::sync::mpmc::list::Block<i32>>::new
at /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/library/alloc/src/boxed.rs:218:9: 218:20
= note: inside std::sync::mpmc::list::Channel::<i32>::start_send
at /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/library/std/src/sync/mpmc/list.rs:209:41: 209:68
= note: inside std::sync::mpmc::list::Channel::<i32>::send
at /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/library/std/src/sync/mpmc/list.rs:402:17: 402:39
= note: inside std::sync::mpmc::Sender::<i32>::send
at /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/library/std/src/sync/mpmc/mod.rs:128:41: 128:61
= note: inside std::sync::mpsc::Sender::<i32>::send
at /home/r/.rustup/toolchains/miri/lib/rustlib/src/rust/library/std/src/sync/mpsc/mod.rs:613:9: 613:27
note: inside closure
--> leak.rs:10:9
|
10 | tx.send(1).unwrap();
| ^^^^^^^^^^
This indicates that the allocation made here does not get freed properly:
let new = Box::into_raw(Box::new(Block::<T>::new())); |
---|
Specifically when running this with Miri 3fe10973bb6e9a01b280686534d0242da07f3ede, seed 139 causes the issue.
I don't think there is any way for this to be a false positive.