-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Closed
Labels
C-bugCategory: This is a bug.Category: This is a bug.T-libsRelevant to the library team, which will review and decide on the PR/issue.Relevant to the library team, which will review and decide on the PR/issue.
Description
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:
rust/library/std/src/io/stdio.rs
Lines 613 to 625 in 9208625
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
Metadata
Metadata
Assignees
Labels
C-bugCategory: This is a bug.Category: This is a bug.T-libsRelevant to the library team, which will review and decide on the PR/issue.Relevant to the library team, which will review and decide on the PR/issue.