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.

贡献者指南