rust-lang/rustfmt

`--check` can overwrite files when `--config emit_mode=files` is used

Chiusa

#6999 aperta il 30 lug 2026

 (3 commenti) (1 reazione) (0 assegnatari)Rust (760 fork)batch import
A-cliA-ioC-buggood first issue

Metriche repository

Star
 (4893 stelle)
Metriche merge PR
 (Merge medio 67g) (5 PR mergiate in 30 g)

Descrizione

Summary

--check can overwrite a source file when emit_mode=files is supplied through --config.

rustfmt --check --emit files <file> is correctly rejected as incompatible. However, the equivalent --config emit_mode=files bypasses that validation and causes rustfmt to format the file in place.

I tried to format this code:

fn main(){println!("hello");}

Expected behavior

I expected --check to be non-mutating regardless of the supplied configuration:

  • Leave file.rs unchanged.
  • Print a diff showing the required formatting.
  • Exit with status code 1.

Alternatively, rustfmt could reject the conflicting --check --config emit_mode=files combination, as it already rejects --check --emit files.

The help message from the cli:


Options:
        --check         Run in 'check' mode. Exits with 0 if input is
                        formatted correctly. Exits with 1 and prints a diff if
                        formatting is required.

Actual behaviour

Instead, rustfmt rewrote file.rs in place:

fn main() {
    println!("hello");
}

It printed nothing to stdout or stderr and exited with status code 0.

Configuration

rustfmt cli options used:

$ rustfmt --check --config emit_mode=files file.rs

rustfmt configuration file:

No rustfmt.toml or .rustfmt.toml file was present.

Reproduction Steps

  1. Create file.rs with this unformatted source:

    fn main(){println!("hello");}
    
  2. Optionally record its checksum:

    shasum -a 256 file.rs
    
  3. Run rustfmt in check mode with emit_mode=files supplied through inline configuration:

    rustfmt --check --config emit_mode=files file.rs
    
  4. Observe that rustfmt exits with status code 0, emits no diff, and rewrites file.rs.

  5. Compare its checksum or contents with the original file.

For comparison, this direct flag combination is rejected:

$ rustfmt --check --emit files file.rs
Invalid to use `--emit` and `--check`

Meta

rustfmt --version:

rustfmt 1.9.0-stable (ac68faa20c 2026-05-25)

I have not yet tested beta or nightly.

Guida contributor