The Rust program below panics when it accesses stdout
in the atexit
handler.
extern crate libc;
extern "C" fn bye() {
println!("bye");
}
fn main() {
println!("hello");
unsafe { libc::atexit(bye) };
}
Output:
hello
thread '<main>' panicked at 'cannot access stdout during shutdown', ../src/libcore/option.rs:298
fatal runtime error: Could not unwind stack, error = 5
An unknown error occurred
It seems to me that this registration should run before our atexit
registration, so this line in the handler should run only after our custom handler. Thus it should not panic.
pointer being freed was not allocated
. When replacingprintln!
withlibc::printf
it works though. I agree: it seems that the rust destruction runs too early – Pollinize