rust-lang/rustfmt

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

已關閉

#6,999 建立於 2026年7月30日

 (3 則留言) (1 個反應) (0 位負責人)Rust (760 個分叉)batch import
A-cliA-ioC-buggood first issue

倉庫指標

星標
 (4,893 顆星)
PR 合併指標
 (平均合併 67天) (30 天內合併 5 個 PR)

描述

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.

貢獻者指南