I tried this code:
fn main() {
extern "C" fn bye() {
print!("hello, world!");
}
unsafe { libc::atexit(bye) };
}
I expected to see this happen:
The code should print "hello, world!", which it does if any print statement occurred before it (see the test).
Instead, this happened:
Nothing is printed to standard output.
The bug is in the cleanup function that disables buffering during shutdown:
|
pub fn cleanup() { |
|
if let Some(instance) = STDOUT.get() { |
|
// Flush the data and disable buffering during shutdown |
|
// by replacing the line writer by one with zero |
|
// buffering capacity. |
|
// We use try_lock() instead of lock(), because someone |
|
// might have leaked a StdoutLock, which would |
|
// otherwise cause a deadlock here. |
|
if let Some(lock) = Pin::static_ref(instance).try_lock() { |
|
*lock.borrow_mut() = LineWriter::with_capacity(0, stdout_raw()); |
|
} |
|
} |
|
} |
If the buffer has not been initialized yet, that will not occur, so the
print statement will initialize the buffer in the normal fashion and it will not be flushed.
Meta
rustc --version --verbose:
rustc 1.63.0 (4b91a6ea7 2022-08-08)
binary: rustc
commit-hash: 4b91a6ea7258a947e59c6522cd5898e7c0a6a88f
commit-date: 2022-08-08
host: aarch64-apple-darwin
release: 1.63.0
LLVM version: 14.0.5
I tried this code:
I expected to see this happen:
The code should print "hello, world!", which it does if any
printstatement occurred before it (see the test).Instead, this happened:
Nothing is printed to standard output.
The bug is in the cleanup function that disables buffering during shutdown:
rust/library/std/src/io/stdio.rs
Lines 613 to 625 in 9208625
If the buffer has not been initialized yet, that will not occur, so the
printstatement will initialize the buffer in the normal fashion and it will not be flushed.Meta
rustc --version --verbose: