rust-lang / rust-lang/rust

Tracking Issue for gracefully handling broken pipes in the compiler

Open
#131,436 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

C-bug C-tracking-issue E-hard T-compiler
Dominant language
Rust
Stars
119k
Forks
16.1k
PR merge metrics
PR metrics pending

Description

Context

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

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=kill paper.

Prior Art

Cargo denies print{,ln}! usages via clippy::print_std{err,out}:

See:

Steps
  • 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.
  • Drop -Zon-broken-pipe=kill when building rustc.
  • Update tests/run-make/broken-pipe-no-ice/rmake.rs regression test.
  • Implement the internal lint.
  • Add documentation about print{,ln}! macro usages in the dev-guide.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by surveying current print! and println! usages in rustc, then read tests/run-make/broken-pipe-no-ice/rmake.rs. The issue calls for classifying desired broken-pipe behavior, proposing an internal lint, updating existing usages and the regression test, and documenting the guidance in the dev-guide; completion is the full checklist, including dropping -Zon-broken-pipe=kill.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
compilers
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.