2018-07-05 10:37:50 +00:00
# Clippy
2016-05-06 14:07:47 +00:00
2022-11-21 19:34:47 +00:00
[![Clippy Test ](https://github.com/rust-lang/rust-clippy/workflows/Clippy%20Test%20(bors )/badge.svg?branch=auto& event=push)](https://github.com/rust-lang/rust-clippy/actions?query=workflow%3A%22Clippy+Test+(bors)%22+event%3Apush+branch%3Aauto)
2019-10-04 15:39:23 +00:00
[![License: MIT OR Apache-2.0 ](https://img.shields.io/crates/l/clippy.svg )](#license)
2014-11-19 07:50:46 +00:00
2017-10-14 19:47:38 +00:00
A collection of lints to catch common mistakes and improve your [Rust ](https://github.com/rust-lang/rust ) code.
2014-11-19 19:19:03 +00:00
2024-01-11 16:27:03 +00:00
[There are over 700 lints included in this crate! ](https://rust-lang.github.io/rust-clippy/master/index.html )
2017-09-01 18:29:36 +00:00
2020-11-23 12:51:04 +00:00
Lints are divided into categories, each with a default [lint level ](https://doc.rust-lang.org/rustc/lints/levels.html ).
You can choose how much Clippy is supposed to ~~annoy~~ help you by changing the lint level by category.
2021-07-01 16:17:38 +00:00
| Category | Description | Default level |
2023-04-11 13:31:08 +00:00
|-----------------------|-------------------------------------------------------------------------------------|---------------|
2021-07-01 16:17:38 +00:00
| `clippy::all` | all lints that are on by default (correctness, suspicious, style, complexity, perf) | **warn/deny** |
| `clippy::correctness` | code that is outright wrong or useless | **deny** |
| `clippy::suspicious` | code that is most likely wrong or useless | **warn** |
| `clippy::style` | code that should be written in a more idiomatic way | **warn** |
| `clippy::complexity` | code that does something simple but in a complex way | **warn** |
| `clippy::perf` | code that can be written to run faster | **warn** |
2021-09-28 17:03:12 +00:00
| `clippy::pedantic` | lints which are rather strict or have occasional false positives | allow |
2023-02-26 00:08:29 +00:00
| `clippy::restriction` | lints which prevent the use of language and library features[^restrict] | allow |
2021-07-01 16:17:38 +00:00
| `clippy::nursery` | new lints that are still under development | allow |
| `clippy::cargo` | lints for the cargo manifest | allow |
2018-03-29 11:04:52 +00:00
2018-11-22 03:40:09 +00:00
More to come, please [file an issue ](https://github.com/rust-lang/rust-clippy/issues ) if you have ideas!
2017-09-01 18:29:36 +00:00
2023-02-26 00:08:29 +00:00
The `restriction` category should, *emphatically* , not be enabled as a whole. The contained
lints may lint against perfectly reasonable code, may not have an alternative suggestion,
and may contradict any other lints (including other categories). Lints should be considered
on a case-by-case basis before enabling.
[^restrict]: Some use cases for `restriction` lints include:
- Strict coding styles (e.g. [`clippy::else_if_without_else`]).
- Additional restrictions on CI (e.g. [`clippy::todo`]).
- Preventing panicking in certain functions (e.g. [`clippy::unwrap_used`]).
- Running a lint only on a subset of code (e.g. `#[forbid(clippy::float_arithmetic)]` on a module).
[`clippy::else_if_without_else`]: https://rust-lang.github.io/rust-clippy/master/index.html#else_if_without_else
[`clippy::todo`]: https://rust-lang.github.io/rust-clippy/master/index.html#todo
[`clippy::unwrap_used`]: https://rust-lang.github.io/rust-clippy/master/index.html#unwrap_used
---
2019-02-22 07:56:49 +00:00
2016-02-22 14:50:40 +00:00
Table of contents:
2016-03-10 20:42:24 +00:00
2023-02-26 00:08:29 +00:00
* [Usage instructions ](#usage )
* [Configuration ](#configuration )
* [Contributing ](#contributing )
* [License ](#license )
2016-05-06 14:07:47 +00:00
2016-09-15 15:19:30 +00:00
## Usage
2022-01-13 12:18:19 +00:00
Below are instructions on how to use Clippy as a cargo subcommand,
in projects that do not use cargo, or in Travis CI.
2016-11-19 03:46:12 +00:00
2018-07-16 20:05:02 +00:00
### As a cargo subcommand (`cargo clippy`)
2016-09-15 15:19:30 +00:00
2018-07-16 20:05:02 +00:00
One way to use Clippy is by installing Clippy through rustup as a cargo
subcommand.
2018-04-02 09:13:02 +00:00
2021-09-08 14:31:47 +00:00
#### Step 1: Install Rustup
2018-04-02 09:13:02 +00:00
2021-09-08 14:31:47 +00:00
You can install [Rustup ](https://rustup.rs/ ) on supported platforms. This will help
2018-09-11 18:29:00 +00:00
us install Clippy and its dependencies.
2017-12-27 16:06:40 +00:00
2021-09-08 14:31:47 +00:00
If you already have Rustup installed, update to ensure you have the latest
Rustup and compiler:
2017-12-27 16:06:40 +00:00
```terminal
2018-07-16 20:05:02 +00:00
rustup update
2017-12-27 16:06:40 +00:00
```
2018-09-11 18:29:00 +00:00
#### Step 2: Install Clippy
2018-01-12 10:33:13 +00:00
2018-09-11 18:29:00 +00:00
Once you have rustup and the latest stable release (at least Rust 1.29) installed, run the following command:
2018-04-02 09:13:02 +00:00
```terminal
2018-12-06 16:11:50 +00:00
rustup component add clippy
2018-04-02 09:13:02 +00:00
```
2023-02-26 00:08:29 +00:00
2019-01-13 01:24:52 +00:00
If it says that it can't find the `clippy` component, please run `rustup self update` .
2018-04-02 09:13:02 +00:00
2019-01-13 00:42:36 +00:00
#### Step 3: Run Clippy
2018-07-16 20:05:02 +00:00
2019-01-13 00:42:36 +00:00
Now you can run Clippy by invoking the following command:
```terminal
cargo clippy
```
2018-09-22 21:35:11 +00:00
2019-08-07 19:07:35 +00:00
#### Automatically applying Clippy suggestions
2019-08-07 14:24:14 +00:00
2023-05-05 15:45:49 +00:00
Clippy can automatically apply some lint suggestions, just like the compiler. Note that `--fix` implies
`--all-targets` , so it can fix as much code as it can.
2019-08-07 14:24:14 +00:00
```terminal
2021-07-01 16:17:38 +00:00
cargo clippy --fix
2019-08-07 14:24:14 +00:00
```
2020-12-20 16:19:49 +00:00
#### Workspaces
All the usual workspace options should work with Clippy. For example the following command
will run Clippy on the `example` crate:
```terminal
cargo clippy -p example
```
As with `cargo check` , this includes dependencies that are members of the workspace, like path dependencies.
If you want to run Clippy **only** on the given crate, use the `--no-deps` option like this:
```terminal
2021-06-21 09:11:37 +00:00
cargo clippy -p example -- --no-deps
2020-12-20 16:19:49 +00:00
```
2022-01-13 12:18:19 +00:00
### Using `clippy-driver`
2021-02-25 10:25:22 +00:00
2022-01-13 12:18:19 +00:00
Clippy can also be used in projects that do not use cargo. To do so, run `clippy-driver`
with the same arguments you use for `rustc` . For example:
2021-02-25 10:25:22 +00:00
```terminal
clippy-driver --edition 2018 -Cpanic=abort foo.rs
```
2022-01-13 12:18:19 +00:00
Note that `clippy-driver` is designed for running Clippy only and should not be used as a general
replacement for `rustc` . `clippy-driver` may produce artifacts that are not optimized as expected,
for example.
2021-02-25 10:25:22 +00:00
2018-09-14 06:21:14 +00:00
### Travis CI
You can add Clippy to Travis CI in the same way you use it locally:
2023-04-11 13:31:08 +00:00
```yaml
2018-09-25 13:40:17 +00:00
language: rust
rust:
- stable
- beta
before_script:
2018-12-06 16:11:50 +00:00
- rustup component add clippy
2018-09-25 13:40:17 +00:00
script:
- cargo clippy
# if you want the build job to fail when encountering warnings, use
- cargo clippy -- -D warnings
2019-03-03 08:48:42 +00:00
# in order to also check tests and non-default crate features, use
2018-09-25 13:40:17 +00:00
- cargo clippy --all-targets --all-features -- -D warnings
- cargo test
# etc.
2018-09-14 06:21:14 +00:00
```
2019-04-08 17:51:54 +00:00
Note that adding `-D warnings` will cause your build to fail if **any** warnings are found in your code.
That includes warnings found by rustc (e.g. `dead_code` , etc.). If you want to avoid this and only cause
2019-08-06 20:09:26 +00:00
an error for Clippy warnings, use `#![deny(clippy::all)]` in your code or `-D clippy::all` on the command
2019-04-11 02:17:17 +00:00
line. (You can swap `clippy::all` with the specific lint category you are targeting.)
2019-04-08 17:51:54 +00:00
2016-09-15 15:19:30 +00:00
## Configuration
### Allowing/denying lints
2018-09-13 09:27:01 +00:00
You can add options to your code to `allow` /`warn`/`deny` Clippy lints:
2016-09-15 15:19:30 +00:00
2023-02-26 00:08:29 +00:00
* the whole set of `Warn` lints using the `clippy` lint group (`#![deny(clippy::all)]`).
2021-12-17 12:40:22 +00:00
Note that `rustc` has additional [lint groups ](https://doc.rust-lang.org/rustc/lints/groups.html ).
2016-09-15 15:19:30 +00:00
2023-02-26 00:08:29 +00:00
* all lints using both the `clippy` and `clippy::pedantic` lint groups (`#![deny(clippy::all)]`,
2018-07-28 15:35:24 +00:00
`#![deny(clippy::pedantic)]` ). Note that `clippy::pedantic` contains some very aggressive
2016-09-15 15:19:30 +00:00
lints prone to false positives.
2023-02-26 00:08:29 +00:00
* only some lints (`#![deny(clippy::single_match, clippy::box_vec)]`, etc.)
2016-09-15 15:19:30 +00:00
2023-02-26 00:08:29 +00:00
* `allow` /`warn`/`deny` can be limited to a single function or module using `#[allow(...)]` , etc.
2016-09-15 15:19:30 +00:00
2020-11-05 13:29:48 +00:00
Note: `allow` means to suppress the lint for your code. With `warn` the lint
will only emit a warning, while with `deny` the lint will emit an error, when
2024-06-13 10:30:48 +00:00
triggering for your code. An error causes Clippy to exit with an error code, so
2020-11-05 13:29:48 +00:00
is useful in scripts like CI/CD.
2016-09-15 15:19:30 +00:00
2020-11-05 13:29:48 +00:00
If you do not want to include your lint levels in your code, you can globally
enable/disable lints by passing extra flags to Clippy during the run:
2020-10-23 20:16:59 +00:00
2020-11-05 13:29:48 +00:00
To allow `lint_name` , run
2020-10-23 20:16:59 +00:00
```terminal
cargo clippy -- -A clippy::lint_name
```
2020-11-05 13:29:48 +00:00
And to warn on `lint_name` , run
2020-10-23 20:16:59 +00:00
```terminal
cargo clippy -- -W clippy::lint_name
```
2021-12-30 14:10:43 +00:00
This also works with lint groups. For example, you
2020-12-06 14:01:03 +00:00
can run Clippy with warnings for all lints enabled:
2023-02-26 00:08:29 +00:00
2020-10-23 20:16:59 +00:00
```terminal
cargo clippy -- -W clippy::pedantic
```
2020-11-05 13:29:48 +00:00
If you care only about a single lint, you can allow all others and then explicitly warn on
2020-10-23 20:16:59 +00:00
the lint(s) you are interested in:
2023-02-26 00:08:29 +00:00
2020-10-23 20:16:59 +00:00
```terminal
cargo clippy -- -A clippy::all -W clippy::useless_format -W clippy::...
```
2018-10-02 08:39:51 +00:00
2022-10-06 07:44:38 +00:00
### Configure the behavior of some lints
Some lints can be configured in a TOML file named `clippy.toml` or `.clippy.toml` . It contains a basic `variable =
value` mapping e.g.
```toml
avoid-breaking-exported-api = false
disallowed-names = ["toto", "tata", "titi"]
```
2023-01-27 20:09:08 +00:00
The [table of configurations ](https://doc.rust-lang.org/nightly/clippy/lint_configuration.html )
contains all config values, their default, and a list of lints they affect.
Each [configurable lint ](https://rust-lang.github.io/rust-clippy/master/index.html#Configuration )
, also contains information about these values.
For configurations that are a list type with default values such as
[disallowed-names ](https://rust-lang.github.io/rust-clippy/master/index.html#disallowed_names ),
you can use the unique value `".."` to extend the default values instead of replacing them.
```toml
# default of disallowed-names is ["foo", "baz", "quux"]
disallowed-names = ["bar", ".."] # -> ["bar", "foo", "baz", "quux"]
```
2022-10-06 07:44:38 +00:00
> **Note**
>
> `clippy.toml` or `.clippy.toml` cannot be used to allow/deny lints.
To deactivate the “for further information visit *lint-link* ” message you can
define the `CLIPPY_DISABLE_DOCS_LINKS` environment variable.
2020-12-06 14:01:03 +00:00
### Specifying the minimum supported Rust version
Projects that intend to support old versions of Rust can disable lints pertaining to newer features by
2024-06-13 10:30:48 +00:00
specifying the minimum supported Rust version (MSRV) in the Clippy configuration file.
2020-12-06 14:01:03 +00:00
```toml
msrv = "1.30.0"
```
2022-06-30 08:50:09 +00:00
Alternatively, the [`rust-version` field ](https://doc.rust-lang.org/cargo/reference/manifest.html#the-rust-version-field )
in the `Cargo.toml` can be used.
```toml
# Cargo.toml
rust-version = "1.30"
```
2022-12-01 17:29:38 +00:00
The MSRV can also be specified as an attribute, like below.
2020-12-06 14:01:03 +00:00
2023-04-11 13:31:08 +00:00
```rust,ignore
2020-12-06 14:01:03 +00:00
#![feature(custom_inner_attributes)]
#![clippy::msrv = "1.30.0"]
fn main() {
...
}
```
You can also omit the patch version when specifying the MSRV, so `msrv = 1.30`
is equivalent to `msrv = 1.30.0` .
2021-12-30 14:10:43 +00:00
Note: `custom_inner_attributes` is an unstable feature, so it has to be enabled explicitly.
2020-12-06 14:01:03 +00:00
Lints that recognize this configuration option can be found [here ](https://rust-lang.github.io/rust-clippy/master/index.html#msrv )
2018-12-22 09:16:52 +00:00
## Contributing
If you want to contribute to Clippy, you can find more information in [CONTRIBUTING.md ](https://github.com/rust-lang/rust-clippy/blob/master/CONTRIBUTING.md ).
2018-12-21 07:11:06 +00:00
2016-05-06 14:07:47 +00:00
## License
2022-11-15 11:09:31 +00:00
<!-- REUSE - IgnoreStart -->
2024-01-11 16:27:03 +00:00
Copyright 2014-2024 The Rust Project Developers
2018-10-07 02:29:01 +00:00
Licensed under the Apache License, Version 2.0 < LICENSE-APACHE or
2019-08-09 02:59:22 +00:00
[https://www.apache.org/licenses/LICENSE-2.0 ](https://www.apache.org/licenses/LICENSE-2.0 )> or the MIT license
< LICENSE-MIT or [https://opensource.org/licenses/MIT ](https://opensource.org/licenses/MIT )> , at your
2019-12-20 08:57:02 +00:00
option. Files in the project may not be
2018-10-07 02:29:01 +00:00
copied, modified, or distributed except according to those terms.
2022-11-15 11:09:31 +00:00
<!-- REUSE - IgnoreEnd -->