Clippy lints / Suspicious
Clippy lint · Suspicious · checked with Clippy 0.1.99
clippy::octal_escapes: octal-looking escape in a literal
What it meansChecks for \0 escapes in string and byte literals that look like octal character escapes in C. It is in the suspicious group and warns by default.
What you see
warning: octal-looking escape in a literal --> main.rs:3:12 | 3 | let one = "\033[1m Bold? \033[0m"; // \033 intended as escape | ^^^^ | = help: octal escapes are not supported, `\0` is always null = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#octal_escapes = note: `#[warn(clippy::octal_escapes)]` on by default help: if an octal escape is intended, use a hex escape instead | 3 - let one = "\033[1m Bold? \033[0m"; // \033 intended as escape 3 + let one = "\x1b[1m Bold? \033[0m"; // \033 intended as escape | help: if a null escape is intended, disambiguate using | 3 | let one = "\x0033[1m Bold? \033[0m"; // \033 intended as escape | ++
Real output of Clippy 0.1.99 (Rust 1.99) on the example below. Names and line numbers in yours will differ.
Does it matter?
C and other languages support octal character escapes in strings, where a backslash is followed by up to three octal digits. For example, \033 stands for the ASCII character 27 (ESC). Rust does not support this notation, but has the escape code \0 which stands for a null byte/character, and any following digits do not form part of the escape sequence. Therefore, \033 is not a compiler error but the result may be surprising.
Code that is most likely wrong or useless. Warns by default.
How to fix it
Clippy does not fix this one automatically (its suggestion may change behaviour, so it only shows it). Change the code by hand:
Flagged
let one = "\033[1m Bold? \033[0m"; // \033 intended as escape
let two = "\033\0"; // \033 intended as null-3-3
Write this instead
let one = "\x1b[1mWill this be bold?\x1b[0m";
let two = "\x0033\x00";
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::octal_escapes)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
octal_escapes = "allow"One run
cargo clippy -- -A clippy::octal-escapesThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
Checks for \0 escapes in string and byte literals that look like octal
character escapes in C.
Why is this bad?
C and other languages support octal character escapes in strings, where
a backslash is followed by up to three octal digits. For example, \033
stands for the ASCII character 27 (ESC). Rust does not support this
notation, but has the escape code \0 which stands for a null
byte/character, and any following digits do not form part of the escape
sequence. Therefore, \033 is not a compiler error but the result may
be surprising.
Known problems
The actual meaning can be the intended one. \x00 can be used in these
cases to be unambiguous.
The lint does not trigger for format strings in print!(), write!()
and friends since the string is already preprocessed when Clippy lints
can see it.
Example
let one = "\033[1m Bold? \033[0m"; // \033 intended as escape
let two = "\033\0"; // \033 intended as null-3-3
Use instead:
let one = "\x1b[1mWill this be bold?\x1b[0m";
let two = "\x0033\x00";
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- no_effect_replacereplacing text with itself
- non_canonical_clone_implnon-canonical implementation of `clone` on a `Copy` type
- non_canonical_partial_ord_implChecks for non-canonical implementations of PartialOrd when Ord is already implemented
- path_ends_with_extLooks for calls to Path::ends_with calls where the argument looks like a file extension. By default, Clippy has a short list of known filenames that start with a dot but aren’t necessarily file extensions (e.g
- permissions_set_readonly_falsecall to `set_readonly` with argument `false`
- pointers_in_nomem_asm_blockpassing pointers to nomem asm block
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::no_effect_replacereplacing text with itselfRead it next →Did this answer your question?