add a lot of text about lints
This commit is contained in:
parent
78b076dadb
commit
50b3a3d121
@ -1 +1,29 @@
|
|||||||
# Lint Groups
|
# Lint Groups
|
||||||
|
|
||||||
|
`rustc` has the concept of a "lint group", where you can toggle several warnings
|
||||||
|
through one name.
|
||||||
|
|
||||||
|
For example, the `nonstandard-style` lint sets `non-camel-case-types`,
|
||||||
|
`non-snake-case`, and `non-upper-case-globals` all at once. So these are
|
||||||
|
equivalent:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ rustc -D nonstandard-style
|
||||||
|
$ rustc -D non-camel-case-types -D non-snake-case -D non-upper-case-globals
|
||||||
|
```
|
||||||
|
|
||||||
|
Here's a list of each lint group, and the lints that they are made up of:
|
||||||
|
|
||||||
|
| group | description | lints |
|
||||||
|
|---------------------|---------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| nonstandard-style | Violation of standard naming conventions | non-camel-case-types, non-snake-case, non-upper-case-globals |
|
||||||
|
| warnings | all lints that would be issuing warnings | all lints that would be issuing warnings |
|
||||||
|
| edition-2018 | Lints that will be turned into errors in Rust 2018 | tyvar-behind-raw-pointer |
|
||||||
|
| rust-2018-idioms | Lints to nudge you toward idiomatic features of Rust 2018 | bare-trait-object, unreachable-pub |
|
||||||
|
| unused | These lints detect things being declared but not used | unused-imports, unused-variables, unused-assignments, dead-code, unused-mut, unreachable-code, unreachable-patterns, unused-must-use, unused-unsafe, path-statements, unused-attributes, unused-macros, unused-allocation, unused-doc-comment, unused-extern-crates, unused-features, unused-parens |
|
||||||
|
| future-incompatible | Lints that detect code that has future-compatibility problems | private-in-public, pub-use-of-private-extern-crate, patterns-in-fns-without-body, safe-extern-statics, invalid-type-param-default, legacy-directory-ownership, legacy-imports, legacy-constructor-visibility, missing-fragment-specifier, illegal-floating-point-literal-pattern, anonymous-parameters, parenthesized-params-in-types-and-modules, late-bound-lifetime-arguments, safe-packed-borrows, incoherent-fundamental-impls, tyvar-behind-raw-pointer, unstable-name-collision |
|
||||||
|
|
||||||
|
Additionally, there's a `bad-style` lint group that's a deprecated alias for `nonstandard-style`.
|
||||||
|
|
||||||
|
Finally, you can also see the table above by invoking `rustc -W help`. This will give you the exact values for the specific
|
||||||
|
compiler you have installed.
|
@ -1 +1,28 @@
|
|||||||
# Lints
|
# Lints
|
||||||
|
|
||||||
|
In software, a "lint" is a tool used to help improve your source code. The
|
||||||
|
Rust compiler contains a number of lints, and when it compiles your code, it will
|
||||||
|
also run the lints. These lints may produce a warning, an error, or nothing at all,
|
||||||
|
depending on how you've configured things.
|
||||||
|
|
||||||
|
Here's a small example:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
$ cat main.rs
|
||||||
|
fn main() {
|
||||||
|
let x = 5;
|
||||||
|
}
|
||||||
|
> rustc main.rs
|
||||||
|
warning: unused variable: `x`
|
||||||
|
--> main.rs:2:9
|
||||||
|
|
|
||||||
|
2 | let x = 5;
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= note: #[warn(unused_variables)] on by default
|
||||||
|
= note: to avoid this warning, consider using `_x` instead
|
||||||
|
```
|
||||||
|
|
||||||
|
This is the `unused_variables` lint, and it tells you that you've introduced
|
||||||
|
a variable that you don't use in your code. That's not *wrong*, so it's not
|
||||||
|
an error, but it might be a bug, so you get a warning.
|
@ -1 +1,252 @@
|
|||||||
# Lint levels
|
# Lint levels
|
||||||
|
|
||||||
|
In `rustc`, lints are divided into four *levels*:
|
||||||
|
|
||||||
|
1. allow
|
||||||
|
2. warn
|
||||||
|
3. deny
|
||||||
|
4. forbid
|
||||||
|
|
||||||
|
Each lint has a default level (explained in the lint listing later in this
|
||||||
|
chapter), and the compiler has a default warning level. First, let's explain
|
||||||
|
what these levels mean, and then we'll talk about configuration.
|
||||||
|
|
||||||
|
## allow
|
||||||
|
|
||||||
|
These lints exist, but by default, do nothing. For example, consider this
|
||||||
|
source:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn foo() {}
|
||||||
|
```
|
||||||
|
|
||||||
|
Compiling this file produces no warnings:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
$ rustc lib.rs --crate-type=lib
|
||||||
|
$
|
||||||
|
```
|
||||||
|
|
||||||
|
But this code violates the `missing_docs` lint.
|
||||||
|
|
||||||
|
These lints exist mostly to be manually turned on via configuration, as we'll
|
||||||
|
talk about later in this section.
|
||||||
|
|
||||||
|
## warn
|
||||||
|
|
||||||
|
The 'warn' lint level will produce a warning if you violate the lint. For example,
|
||||||
|
this code runs afoul of the `unused_variable` lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn foo() {
|
||||||
|
let x = 5;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This will produce this warning:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
> rustc lib.rs --crate-type=lib
|
||||||
|
warning: unused variable: `x`
|
||||||
|
--> lib.rs:2:9
|
||||||
|
|
|
||||||
|
2 | let x = 5;
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= note: #[warn(unused_variables)] on by default
|
||||||
|
= note: to avoid this warning, consider using `_x` instead
|
||||||
|
```
|
||||||
|
|
||||||
|
## deny
|
||||||
|
|
||||||
|
A 'deny' lint produces an error if you violate it. For example, this code
|
||||||
|
runs into the `exceeding_bitshifts` lint.
|
||||||
|
|
||||||
|
```rust
|
||||||
|
fn main() {
|
||||||
|
100u8 << 10;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
> rustc main.rs
|
||||||
|
error: bitshift exceeds the type's number of bits
|
||||||
|
--> main.rs:2:13
|
||||||
|
|
|
||||||
|
2 | 100u8 << 10;
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: #[deny(exceeding_bitshifts)] on by default
|
||||||
|
```
|
||||||
|
|
||||||
|
What's the difference between an error from a lint and a regular old error?
|
||||||
|
Lints are configurable via levels, so in a similar way to 'allow' lints,
|
||||||
|
warnings that are 'deny' by default let you allow them. Similarly, you may
|
||||||
|
wish to set up a lint that is `warn` by default to produce an error instead.
|
||||||
|
This lint level gives you that.
|
||||||
|
|
||||||
|
## forbid
|
||||||
|
|
||||||
|
'forbid' is a special lint level that's stronger than 'deny'. It's the same
|
||||||
|
as 'deny' in that a lint at this level will produce an error, but unlike the
|
||||||
|
'deny' level, the 'forbid' level can not be overridden to be anything lower
|
||||||
|
than an error.
|
||||||
|
|
||||||
|
## Configuring warning levels
|
||||||
|
|
||||||
|
Remember our `missing_docs` example from the 'allow' lint level?
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cat lib.rs
|
||||||
|
pub fn foo() {}
|
||||||
|
$ rustc lib.rs --crate-type=lib
|
||||||
|
$
|
||||||
|
```
|
||||||
|
|
||||||
|
We can configure this lint to operate at a higher level, both with
|
||||||
|
compiler flags, as well as with an attribute in the source code.
|
||||||
|
|
||||||
|
You can also "cap" lints so that the compiler can choose to ignore
|
||||||
|
certain lint levels. We'll talk about that last.
|
||||||
|
|
||||||
|
### Via compiler flag
|
||||||
|
|
||||||
|
The `-A`, `-W`, `-D`, and `-F` flags let you turn one or more lints
|
||||||
|
into allowed, warning, deny, or forbid levels, like this:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ rustc lib.rs --crate-type=lib -W missing-docs
|
||||||
|
warning: missing documentation for crate
|
||||||
|
--> lib.rs:1:1
|
||||||
|
|
|
||||||
|
1 | pub fn foo() {}
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: requested on the command line with `-W missing-docs`
|
||||||
|
|
||||||
|
warning: missing documentation for a function
|
||||||
|
--> lib.rs:1:1
|
||||||
|
|
|
||||||
|
1 | pub fn foo() {}
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
> rustc lib.rs --crate-type=lib -D missing-docs
|
||||||
|
error: missing documentation for crate
|
||||||
|
--> lib.rs:1:1
|
||||||
|
|
|
||||||
|
1 | pub fn foo() {}
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: requested on the command line with `-D missing-docs`
|
||||||
|
|
||||||
|
error: missing documentation for a function
|
||||||
|
--> lib.rs:1:1
|
||||||
|
|
|
||||||
|
1 | pub fn foo() {}
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also pass each flag more than once for changing multiple lints:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rustc lib.rs --crate-type=lib -D missing-docs -D unused-variables
|
||||||
|
```
|
||||||
|
|
||||||
|
And of course, you can mix these four flags together:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rustc lib.rs --crate-type=lib -D missing-docs -A unused-variables
|
||||||
|
```
|
||||||
|
|
||||||
|
### Via an attribute
|
||||||
|
|
||||||
|
You can also modify the lint level with a crate-wide attribute:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
> cat lib.rs
|
||||||
|
#![warn(missing_docs)]
|
||||||
|
|
||||||
|
pub fn foo() {}
|
||||||
|
$ rustc lib.rs --crate-type=lib
|
||||||
|
warning: missing documentation for crate
|
||||||
|
--> lib.rs:1:1
|
||||||
|
|
|
||||||
|
1 | / #![warn(missing_docs)]
|
||||||
|
2 | |
|
||||||
|
3 | | pub fn foo() {}
|
||||||
|
| |_______________^
|
||||||
|
|
|
||||||
|
note: lint level defined here
|
||||||
|
--> lib.rs:1:9
|
||||||
|
|
|
||||||
|
1 | #![warn(missing_docs)]
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
||||||
|
warning: missing documentation for a function
|
||||||
|
--> lib.rs:3:1
|
||||||
|
|
|
||||||
|
3 | pub fn foo() {}
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
```
|
||||||
|
|
||||||
|
All four, `warn`, `allow`, `deny`, and `forbid` all work this way.
|
||||||
|
|
||||||
|
You can also pass in multiple lints per attribute:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
#![warn(missing_docs, unused_variables)]
|
||||||
|
|
||||||
|
pub fn foo() {}
|
||||||
|
```
|
||||||
|
|
||||||
|
And use multiple attributes together:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
#![warn(missing_docs)]
|
||||||
|
#![deny(unused_variables)]
|
||||||
|
|
||||||
|
pub fn foo() {}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Capping lints
|
||||||
|
|
||||||
|
`rustc` supports a flag, `--cap-lints LEVEL` that sets the "lint cap level."
|
||||||
|
This is the maximum level for all lints. So for example, if we take our
|
||||||
|
code sample from the "deny" lint level above:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
fn main() {
|
||||||
|
100u8 << 10;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
And we compile it, capping lints to warn:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ rustc lib.rs --cap-lints warn
|
||||||
|
warning: bitshift exceeds the type's number of bits
|
||||||
|
--> lib.rs:2:5
|
||||||
|
|
|
||||||
|
2 | 100u8 << 10;
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: #[warn(exceeding_bitshifts)] on by default
|
||||||
|
|
||||||
|
warning: this expression will panic at run-time
|
||||||
|
--> lib.rs:2:5
|
||||||
|
|
|
||||||
|
2 | 100u8 << 10;
|
||||||
|
| ^^^^^^^^^^^ attempt to shift left with overflow
|
||||||
|
```
|
||||||
|
|
||||||
|
It now only warns, rather than errors. We can go further and allow all lints:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ rustc lib.rs --cap-lints allow
|
||||||
|
$
|
||||||
|
```
|
||||||
|
|
||||||
|
This feature is used heavily by Cargo; it will pass `--cap-lints allow` when
|
||||||
|
compiling your dependencies, so that if they have any warnings, they do not
|
||||||
|
pollute the output of your build.
|
@ -1 +1,452 @@
|
|||||||
# Allowed-by-default lints
|
# Allowed-by-default lints
|
||||||
|
|
||||||
|
These lints are all set to the 'allow' level by default. As such, they won't show up
|
||||||
|
unless you set them to a higher lint level with a flag or attribute.
|
||||||
|
|
||||||
|
## anonymous-parameters
|
||||||
|
|
||||||
|
This lint detects anonymous parameters. Some example code that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
trait Foo {
|
||||||
|
fn foo(usize);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: use of deprecated anonymous parameter
|
||||||
|
--> src/lib.rs:5:11
|
||||||
|
|
|
||||||
|
5 | fn foo(usize);
|
||||||
|
| ^
|
||||||
|
|
|
||||||
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
= note: for more information, see issue #41686 <https://github.com/rust-lang/rust/issues/41686>
|
||||||
|
```
|
||||||
|
|
||||||
|
This syntax is mostly a historical accident, and can be worked around quite
|
||||||
|
easily:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
trait Foo {
|
||||||
|
fn foo(_: usize);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## bare-trait-object
|
||||||
|
|
||||||
|
This lint suggests using `dyn Trait` for trait objects. Some example code
|
||||||
|
that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
#![feature(dyn_trait)]
|
||||||
|
|
||||||
|
trait Trait { }
|
||||||
|
|
||||||
|
fn takes_trait_object(_: Box<Trait>) {
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: trait objects without an explicit `dyn` are deprecated
|
||||||
|
--> src/lib.rs:7:30
|
||||||
|
|
|
||||||
|
7 | fn takes_trait_object(_: Box<Trait>) {
|
||||||
|
| ^^^^^ help: use `dyn`: `dyn Trait`
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
To fix it, do as the help message suggests:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
#![feature(dyn_trait)]
|
||||||
|
#![deny(bare_trait_object)]
|
||||||
|
|
||||||
|
trait Trait { }
|
||||||
|
|
||||||
|
fn takes_trait_object(_: Box<dyn Trait>) {
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## box-pointers
|
||||||
|
|
||||||
|
This lints use of the Box type. Some example code that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
struct Foo {
|
||||||
|
x: Box<isize>,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: type uses owned (Box type) pointers: std::boxed::Box<isize>
|
||||||
|
--> src/lib.rs:6:5
|
||||||
|
|
|
||||||
|
6 | x: Box<isize> //~ ERROR type uses owned
|
||||||
|
| ^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
This lint is mostly historical, and not particularly useful. `Box<T>` used to
|
||||||
|
be built into the language, and the only way to do heap allocation. Today's
|
||||||
|
Rust can call into other allocators, etc.
|
||||||
|
|
||||||
|
## elided-lifetime-in-path
|
||||||
|
|
||||||
|
This lint detects the use of hidden lifetime parameters. Some example code
|
||||||
|
that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
struct Foo<'a> {
|
||||||
|
x: &'a u32
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo(x: &Foo) {
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: hidden lifetime parameters are deprecated, try `Foo<'_>`
|
||||||
|
--> src/lib.rs:5:12
|
||||||
|
|
|
||||||
|
5 | fn foo(x: &Foo) {
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Lifetime elision elides this lifetime, but that is being deprecated.
|
||||||
|
|
||||||
|
## missing-copy-implementations
|
||||||
|
|
||||||
|
This lint detects potentially-forgotten implementations of `Copy`. Some
|
||||||
|
example code that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub struct Foo {
|
||||||
|
pub field: i32
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: type could implement `Copy`; consider adding `impl Copy`
|
||||||
|
--> src/main.rs:3:1
|
||||||
|
|
|
||||||
|
3 | / pub struct Foo { //~ ERROR type could implement `Copy`; consider adding `impl Copy`
|
||||||
|
4 | | pub field: i32
|
||||||
|
5 | | }
|
||||||
|
| |_^
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
You can fix the lint by deriving `Copy`.
|
||||||
|
|
||||||
|
This lint is set to 'allow' because this code isn't bad; it's common to write
|
||||||
|
newtypes like this specifically so that a `Copy` type is no longer `Copy`.
|
||||||
|
|
||||||
|
## missing-debug-implementations
|
||||||
|
|
||||||
|
This lint detects missing implementations of `fmt::Debug`. Some example code
|
||||||
|
that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub struct Foo;
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: type does not implement `fmt::Debug`; consider adding #[derive(Debug)] or a manual implementation
|
||||||
|
--> src/main.rs:3:1
|
||||||
|
|
|
||||||
|
3 | pub struct Foo;
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
You can fix the lint by deriving `Debug`.
|
||||||
|
|
||||||
|
## missing-docs
|
||||||
|
|
||||||
|
This lint detects missing documentation for public items. Some example code
|
||||||
|
that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub fn foo() {}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: missing documentation for crate
|
||||||
|
--> src/main.rs:1:1
|
||||||
|
|
|
||||||
|
1 | / #![deny(missing_docs)]
|
||||||
|
2 | |
|
||||||
|
3 | | pub fn foo() {}
|
||||||
|
4 | |
|
||||||
|
5 | | fn main() {}
|
||||||
|
| |____________^
|
||||||
|
|
|
||||||
|
|
||||||
|
error: missing documentation for a function
|
||||||
|
--> src/main.rs:3:1
|
||||||
|
|
|
||||||
|
3 | pub fn foo() {}
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
To fix the lint, add documentation to all items.
|
||||||
|
|
||||||
|
## single-use-lifetime
|
||||||
|
|
||||||
|
This lint detects lifetimes that are only used once. Some example code that
|
||||||
|
triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
struct Foo<'x> {
|
||||||
|
x: &'x u32
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: lifetime name `'x` only used once
|
||||||
|
--> src/main.rs:3:12
|
||||||
|
|
|
||||||
|
3 | struct Foo<'x> {
|
||||||
|
| ^^
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## trivial-casts
|
||||||
|
|
||||||
|
This lint detects trivial casts which could be removed. Some example code
|
||||||
|
that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let x: &u32 = &42;
|
||||||
|
let _ = x as *const u32;
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: trivial cast: `&u32` as `*const u32`. Cast can be replaced by coercion, this might require type ascription or a temporary variable
|
||||||
|
--> src/main.rs:5:13
|
||||||
|
|
|
||||||
|
5 | let _ = x as *const u32;
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: lint level defined here
|
||||||
|
--> src/main.rs:1:9
|
||||||
|
|
|
||||||
|
1 | #![deny(trivial_casts)]
|
||||||
|
| ^^^^^^^^^^^^^
|
||||||
|
```
|
||||||
|
|
||||||
|
## trivial-numeric-casts
|
||||||
|
|
||||||
|
This lint detects trivial casts of numeric types which could be removed. Some
|
||||||
|
example code that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let x = 42i32 as i32;
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: trivial numeric cast: `i32` as `i32`. Cast can be replaced by coercion, this might require type ascription or a temporary variable
|
||||||
|
--> src/main.rs:4:13
|
||||||
|
|
|
||||||
|
4 | let x = 42i32 as i32;
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## unreachable-pub
|
||||||
|
|
||||||
|
This lint triggers for `pub` items not reachable from the crate root. Some
|
||||||
|
example code that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
mod foo {
|
||||||
|
pub mod bar {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: unreachable `pub` item
|
||||||
|
--> src/main.rs:4:5
|
||||||
|
|
|
||||||
|
4 | pub mod bar {
|
||||||
|
| ---^^^^^^^^
|
||||||
|
| |
|
||||||
|
| help: consider restricting its visibility: `pub(crate)`
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## unsafe-code
|
||||||
|
|
||||||
|
This lint catches usage of `unsafe` code. Some example code that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
fn main() {
|
||||||
|
unsafe {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: usage of an `unsafe` block
|
||||||
|
--> src/main.rs:4:5
|
||||||
|
|
|
||||||
|
4 | / unsafe {
|
||||||
|
5 | |
|
||||||
|
6 | | }
|
||||||
|
| |_____^
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## unstable-features
|
||||||
|
|
||||||
|
This lint is deprecated and no longer used.
|
||||||
|
|
||||||
|
## unused-extern-crates
|
||||||
|
|
||||||
|
This lint guards against `extern crate` items that are never used. Some
|
||||||
|
example code that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
extern crate semver;
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: unused extern crate
|
||||||
|
--> src/main.rs:3:1
|
||||||
|
|
|
||||||
|
3 | extern crate semver;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## unused-import-braces
|
||||||
|
|
||||||
|
This lint catches unnecessary braces around an imported item. Some example
|
||||||
|
code that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use test::{A};
|
||||||
|
|
||||||
|
mod test {
|
||||||
|
struct A;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: braces around A is unnecessary
|
||||||
|
--> src/main.rs:3:1
|
||||||
|
|
|
||||||
|
3 | use test::{A};
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
To fix it, `use test::A;`
|
||||||
|
|
||||||
|
## unused-qualifications
|
||||||
|
|
||||||
|
This lint detects unnecessarily qualified names. Some example code that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
mod foo {
|
||||||
|
pub fn bar() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
use foo::bar;
|
||||||
|
foo::bar();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: unnecessary qualification
|
||||||
|
--> src/main.rs:9:5
|
||||||
|
|
|
||||||
|
9 | foo::bar();
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
You can call `bar()` directly, without the `foo::`.
|
||||||
|
|
||||||
|
## unused-results
|
||||||
|
|
||||||
|
This lint checks for the unused result of an expression in a statement. Some
|
||||||
|
example code that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
fn foo<T>() -> T { panic!() }
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
foo::<usize>();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: unused result
|
||||||
|
--> src/main.rs:6:5
|
||||||
|
|
|
||||||
|
6 | foo::<usize>();
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## variant-size-differences
|
||||||
|
|
||||||
|
This lint detects enums with widely varying variant sizes. Some example code that triggers this lint:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
enum En {
|
||||||
|
V0(u8),
|
||||||
|
VBig([u8; 1024]), //~ ERROR variant is more than three times larger
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
When set to 'deny', this will produce:
|
||||||
|
|
||||||
|
```text
|
||||||
|
error: enum variant is more than three times larger (1024 bytes) than the next largest
|
||||||
|
--> src/main.rs:5:5
|
||||||
|
|
|
||||||
|
5 | VBig([u8; 1024]), //~ ERROR variant is more than three times larger
|
||||||
|
| ^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
```
|
@ -1 +1,16 @@
|
|||||||
# Deny-by-default lints
|
# Deny-by-default lints
|
||||||
|
|
||||||
|
These lints are all set to the 'deny' level by default.
|
||||||
|
|
||||||
|
exceeding-bitshifts deny shift exceeds the type's number of bits
|
||||||
|
invalid-type-param-default deny type parameter default erroneously allowed in invalid location
|
||||||
|
legacy-constructor-visibility deny detects use of struct constructors that would be invisible with new visibility rules
|
||||||
|
legacy-directory-ownership deny non-inline, non-`#[path]` modules (e.g. `mod foo;`) were erroneously allowed in some files not named `mod.rs`
|
||||||
|
legacy-imports deny detects names that resolve to ambiguous glob imports with RFC 1560
|
||||||
|
missing-fragment-specifier deny detects missing fragment specifiers in unused `macro_rules!` patterns
|
||||||
|
mutable-transmutes deny mutating transmuted &mut T from &T may cause undefined behavior
|
||||||
|
no-mangle-const-items deny const items will not have their symbols exported
|
||||||
|
parenthesized-params-in-types-and-modules deny detects parenthesized generic parameters in type and module names
|
||||||
|
pub-use-of-private-extern-crate deny detect public re-exports of private extern crates
|
||||||
|
safe-extern-statics deny safe access to extern statics was erroneously allowed
|
||||||
|
unknown-crate-types deny unknown crate type found in #[crate_type] directive
|
@ -1 +1,5 @@
|
|||||||
# Lint listing
|
# Lint listing
|
||||||
|
|
||||||
|
This section lists out all of the lints, grouped by their default lint levels.
|
||||||
|
|
||||||
|
You can also see this list by running `rustc -W help`.
|
@ -1 +1,49 @@
|
|||||||
# Warn-by-default lints
|
# Warn-by-default lints
|
||||||
|
|
||||||
|
These lints are all set to the 'warn' level by default.
|
||||||
|
|
||||||
|
const-err warn constant evaluation detected erroneous expression
|
||||||
|
dead-code warn detect unused, unexported items
|
||||||
|
deprecated warn detects use of deprecated items
|
||||||
|
illegal-floating-point-literal-pattern warn floating-point literals cannot be used in patterns
|
||||||
|
improper-ctypes warn proper use of libc types in foreign modules
|
||||||
|
incoherent-fundamental-impls warn potentially-conflicting impls were erroneously allowed
|
||||||
|
late-bound-lifetime-arguments warn detects generic lifetime arguments in path segments with late bound lifetime parameters
|
||||||
|
non-camel-case-types warn types, variants, traits and type parameters should have camel case names
|
||||||
|
non-shorthand-field-patterns warn using `Struct { x: x }` instead of `Struct { x }` in a pattern
|
||||||
|
non-snake-case warn variables, methods, functions, lifetime parameters and modules should have snake case names
|
||||||
|
non-upper-case-globals warn static constants should have uppercase identifiers
|
||||||
|
no-mangle-generic-items warn generic items must be mangled
|
||||||
|
overflowing-literals warn literal out of range for its type
|
||||||
|
path-statements warn path statements with no effect
|
||||||
|
patterns-in-fns-without-body warn patterns in functions without body were erroneously allowed
|
||||||
|
plugin-as-library warn compiler plugin used as ordinary library in non-plugin crate
|
||||||
|
private-in-public warn detect private items in public interfaces not caught by the old implementation
|
||||||
|
private-no-mangle-fns warn functions marked #[no_mangle] should be exported
|
||||||
|
private-no-mangle-statics warn statics marked #[no_mangle] should be exported
|
||||||
|
renamed-and-removed-lints warn lints that have been renamed or removed
|
||||||
|
safe-packed-borrows warn safe borrows of fields of packed structs were was erroneously allowed
|
||||||
|
stable-features warn stable features found in #[feature] directive
|
||||||
|
type-alias-bounds warn bounds in type aliases are not enforced
|
||||||
|
tyvar-behind-raw-pointer warn raw pointer to an inference variable
|
||||||
|
unconditional-recursion warn functions that cannot return without calling themselves
|
||||||
|
unions-with-drop-fields warn use of unions that contain fields with possibly non-trivial drop code
|
||||||
|
unknown-lints warn unrecognized lint attribute
|
||||||
|
unreachable-code warn detects unreachable code paths
|
||||||
|
unreachable-patterns warn detects unreachable patterns
|
||||||
|
unstable-name-collision warn detects name collision with an existing but unstable method
|
||||||
|
unused-allocation warn detects unnecessary allocations that can be eliminated
|
||||||
|
unused-assignments warn detect assignments that will never be read
|
||||||
|
unused-attributes warn detects attributes that were not used by the compiler
|
||||||
|
unused-comparisons warn comparisons made useless by limits of the types involved
|
||||||
|
unused-doc-comment warn detects doc comments that aren't used by rustdoc
|
||||||
|
unused-features warn unused or unknown features found in crate-level #[feature] directives
|
||||||
|
unused-imports warn imports that are never used
|
||||||
|
unused-macros warn detects macros that were not used
|
||||||
|
unused-must-use warn unused result of a type flagged as #[must_use]
|
||||||
|
unused-mut warn detect mut variables which don't need to be mutable
|
||||||
|
unused-parens warn `if`, `match`, `while` and `return` do not need parentheses
|
||||||
|
unused-unsafe warn unnecessary use of an `unsafe` block
|
||||||
|
unused-variables warn detect variables which are not used in any way
|
||||||
|
warnings warn mass-change the level for lints which produce warnings
|
||||||
|
while-true warn suggest using `loop { }` instead of `while true { }`
|
Loading…
x
Reference in New Issue
Block a user