mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 16:54:01 +00:00
015e9371e0
debug-fmt-detail option I'd like to propose a new option that makes `#[derive(Debug)]` generate no-op implementations that don't print anything, and makes `{:?}` in format strings a no-op. There are a couple of motivations for this: 1. A more thorough stripping of debug symbols. Binaries stripped of debug symbols still retain some of them through `Debug` implementations. It's hard to avoid that without compiler's help, because debug formatting can be used in many places, including dependencies, and their loggers, asserts, panics, etc. * In my testing it gives about 2% binary size reduction on top of all other binary-minimizing best practices (including `panic_immediate_abort`). There are targets like Web WASM or embedded where users pay attention to binary sizes. * Users distributing closed-source binaries may not want to "leak" any symbol names as a matter of principle. 2. Adds ability to test whether code depends on specifics of the `Debug` format implementation in unwise ways (e.g. trying to get data unavailable via public interface, or using it as a serialization format). Because current Rust's debug implementation doesn't change, there's a risk of it becoming a fragile de-facto API that [won't be possible to change in the future](https://www.hyrumslaw.com/). An option that "breaks" it can act as a [grease](https://www.rfc-editor.org/rfc/rfc8701.html). This implementation is a `-Z fmt-debug=opt` flag that takes: * `full` — the default, current state. * `none` — makes derived `Debug` and `{:?}` no-ops. Explicit `impl Debug for T` implementations are left unharmed, but `{:?}` format won't use them, so they may get dead-code eliminated if they aren't invoked directly. * `shallow` — makes derived `Debug` print only the type's name, without recursing into fields. Fieldless enums print their variant names. `{:?}` works. The `shallow` option is a compromise between minimizing the `Debug` code, and compatibility. There are popular proc-macro crates that use `Debug::fmt` as a way to convert enum values into their Rust source code. There's a corresponding `cfg` flag: `#[cfg(fmt_debug = "none")]` that can be used in user code to react to this setting to minimize custom `Debug` implementations or remove unnecessary formatting helper functions. |
||
---|---|---|
.. | ||
allow-at-crate-level.rs | ||
allow-macro-cfg.rs | ||
allow-same-level.rs | ||
allow-same-level.stderr | ||
allow-top-level.rs | ||
allow-upper-level.rs | ||
cargo-build-script.rs | ||
cargo-build-script.stderr | ||
cargo-feature.none.stderr | ||
cargo-feature.rs | ||
cargo-feature.some.stderr | ||
cfg-value-for-cfg-name-duplicate.rs | ||
cfg-value-for-cfg-name-duplicate.stderr | ||
cfg-value-for-cfg-name-multiple.rs | ||
cfg-value-for-cfg-name-multiple.stderr | ||
cfg-value-for-cfg-name.rs | ||
cfg-value-for-cfg-name.stderr | ||
compact-names.rs | ||
compact-names.stderr | ||
compact-values.rs | ||
compact-values.stderr | ||
concat-values.rs | ||
concat-values.stderr | ||
diagnotics.cargo.stderr | ||
diagnotics.rs | ||
diagnotics.rustc.stderr | ||
empty-values.rs | ||
empty-values.stderr | ||
exhaustive-names-values.empty_cfg.stderr | ||
exhaustive-names-values.feature.stderr | ||
exhaustive-names-values.full.stderr | ||
exhaustive-names-values.rs | ||
exhaustive-names.rs | ||
exhaustive-names.stderr | ||
exhaustive-values.empty_cfg.stderr | ||
exhaustive-values.rs | ||
exhaustive-values.without_names.stderr | ||
invalid-arguments.any_values.stderr | ||
invalid-arguments.anything_else.stderr | ||
invalid-arguments.boolean.stderr | ||
invalid-arguments.cfg_none.stderr | ||
invalid-arguments.giberich.stderr | ||
invalid-arguments.ident_in_values_1.stderr | ||
invalid-arguments.ident_in_values_2.stderr | ||
invalid-arguments.mixed_any.stderr | ||
invalid-arguments.mixed_values_any.stderr | ||
invalid-arguments.multiple_any.stderr | ||
invalid-arguments.multiple_values_any.stderr | ||
invalid-arguments.multiple_values.stderr | ||
invalid-arguments.none_not_empty.stderr | ||
invalid-arguments.not_empty_any.stderr | ||
invalid-arguments.not_empty_values_any.stderr | ||
invalid-arguments.rs | ||
invalid-arguments.string_for_name_1.stderr | ||
invalid-arguments.string_for_name_2.stderr | ||
invalid-arguments.unknown_meta_item_1.stderr | ||
invalid-arguments.unknown_meta_item_2.stderr | ||
invalid-arguments.unknown_meta_item_3.stderr | ||
invalid-arguments.unterminated.stderr | ||
invalid-arguments.values_any_before_ident.stderr | ||
invalid-arguments.values_any_missing_values.stderr | ||
mix.rs | ||
mix.stderr | ||
my-awesome-platform.json | ||
no-expected-values.empty.stderr | ||
no-expected-values.mixed.stderr | ||
no-expected-values.rs | ||
no-expected-values.simple.stderr | ||
order-independant.rs | ||
order-independant.values_after.stderr | ||
order-independant.values_before.stderr | ||
stmt-no-ice.rs | ||
stmt-no-ice.stderr | ||
unexpected-cfg-name.rs | ||
unexpected-cfg-name.stderr | ||
unexpected-cfg-value.rs | ||
unexpected-cfg-value.stderr | ||
unknown-values.rs | ||
values-none.concat_1.stderr | ||
values-none.concat_2.stderr | ||
values-none.explicit.stderr | ||
values-none.implicit.stderr | ||
values-none.rs | ||
values-none.simple.stderr | ||
values-target-json.rs | ||
well-known-names.rs | ||
well-known-names.stderr | ||
well-known-values.rs | ||
well-known-values.stderr |