You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
std print! and println! by default will panic on a broken pipe if -Zon-broken-pipe=kill is not set when building rustc itself and left as default. If such a panic occurs and is not otherwise caught, it will manifest as an ICE. In bootstrap we build rustc with -Zon-broken-pipe=kill which terminates rustc to paper over issues like rustc --print=sysroot | false ICEing from the I/O panic from a broken pipe, but this is not always the desirabled behavior. As Nora said:
rustc --print=target-list | head -n5 should definitely work as expected and print only 5 targets and exit successfully, ICEing or erroring are not acceptable imo
so kill should still be passed
and rustc --print=target-list >/dev/full emitting an error instead of crashing would be neat too
Survey current usages of print{,ln}! macro usages in rustc.
Classify desired behavior if we do handle I/O errors if we use some safe_print{,ln} alternative instead of panicking like print{,ln} (some might want to exit with success, some might want to error, but we probably never want to ICE).
Open an MCP to propose migrating print{,ln}! macro usages to properly handle errors and adding an internal lint to deny (in CI, but allow locally to still allow printf debugging) raw usages of print{,ln}!.
Fix existing print{,ln}! macro usages to properly handle errors.
Context
std
print!andprintln!by default will panic on a broken pipe if-Zon-broken-pipe=killis not set when building rustc itself and left as default. If such a panic occurs and is not otherwise caught, it will manifest as an ICE. In bootstrap we build rustc with-Zon-broken-pipe=killwhich terminates rustc to paper over issues likerustc --print=sysroot | falseICEing from the I/O panic from a broken pipe, but this is not always the desirabled behavior. As Nora said:See https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler/topic/Internal.20lint.20for.20raw.20.60print!.60.20and.20.60println!.60.3F for a timeline of how we ended up with the
-Zon-broken-pipe=killpaper.Prior Art
Cargo denies
print{,ln}!usages viaclippy::print_std{err,out}:See:
Steps
print{,ln}!macro usages in rustc.safe_print{,ln}alternative instead of panicking likeprint{,ln}(some might want to exit with success, some might want to error, but we probably never want to ICE).print{,ln}!macro usages to properly handle errors and adding an internal lint to deny (in CI, but allow locally to still allow printf debugging) raw usages ofprint{,ln}!.print{,ln}!macro usages to properly handle errors.-Zon-broken-pipe=killwhen building rustc.tests/run-make/broken-pipe-no-ice/rmake.rsregression test.print{,ln}!macro usages in the dev-guide.