src | ||
tests | ||
.gitignore | ||
.travis.yml | ||
Cargo.toml | ||
CONTRIBUTING.md | ||
README.md |
A collection of lints that give helpful tips to newbies and catch oversights.
##Lints Lints included in this crate:
single_match
: Warns when a match statement with a single nontrivial arm (i.e, where the other arm is_ => {}
) is used, and recommendsif let
instead.box_vec
: Warns on usage ofBox<Vec<T>>
linkedlist
: Warns on usage ofLinkedList
str_to_string
: Warns on usage ofstr::to_string()
toplevel_ref_arg
: Warns when a function argument is declaredref
(i.e.fn foo(ref x: u8)
, but notfn foo((ref x, ref y): (u8, u8))
)eq_op
: Warns on equal operands on both sides of a comparison or bitwise combinationbad_bit_mask
: Denies expressions of the form_ & mask == select
that will only ever returntrue
orfalse
(because in the exampleselect
containing bits thatmask
doesn't have)ineffective_bit_mask
: Warns on expressions where a bit mask will be rendered useless by a comparison, e.g.(x | 1) > 2
needless_bool
: Warns on if-statements with plain booleans in the then- and else-clause, e.g.if p { true } else { false }
ptr_arg
: Warns on fn arguments of the type&Vec<...>
or&String
, suggesting to use&[...]
or&str
instead, respectivelyapprox_constant
: Warns if the approximate of a known float constant (instd::f64::consts
orstd::f32::consts
) is found and suggests to use the constantcmp_nan
: Denies comparisons to NAN (which will always return false, which is probably not intended)float_cmp
: Warns on==
or!=
comparisons of floaty typed values. As floating-point operations usually involve rounding errors, it is always better to check for approximate equality within some small boundsprecedence
: Warns on expressions where precedence may trip up the unwary reader of the source and suggests adding parenthesis, e.g.x << 2 + y
will be parsed asx << (2 + y)
redundant_closure
: Warns on usage of eta-reducible closures like|a| foo(a)
(which can be written as justfoo
)identity_op
: Warns on identity operations likex + 0
ory / 1
(which can be reduced tox
andy
, respectively)mut_mut
: Warns on&mut &mut
which is either a copy'n'paste error, or shows a fundamental misunderstanding of referenceslen_zero
: Warns on_.len() == 0
and suggests using_.is_empty()
(or similar comparisons with>
or!=
)len_without_is_empty
: Warns on traits or impls that have a.len()
but no.is_empty()
methodcmp_owned
: Warns on creating owned instances for comparing with others, e.g.x == "foo".to_string()
inline_always
: Warns on#[inline(always)]
, because in most cases it is a bad ideacollapsible_if
: Warns on cases where two nestedif
-expressions can be collapsed into one, e.g.if x { if y { foo() } }
can be written asif x && y { foo() }
zero_width_space
: Warns on encountering a unicode zero-width spacestring_add_assign
: Warns onx = x + ..
wherex
is aString
and suggests usingpush_str(..)
instead. Allowed by default.string_add
: Matchesx + ..
wherex
is aString
and wherestring_add_assign
doesn't warn. Allowed by default.needless_return
: Warns on usingreturn expr;
when a simpleexpr
would suffice.let_and_return
: Warns on doinglet x = expr; x
at the end of a function.option_unwrap_used
: Warns whenOption.unwrap()
is used, and suggests.expect()
.result_unwrap_used
: Warns whenResult.unwrap()
is used (silent by default).modulo_one
: Warns on taking a number modulo 1, which always has a result of 0.
To use, add the following lines to your Cargo.toml:
[dependencies]
clippy = "*"
More to come, please file an issue if you have ideas!
##Usage
Compiler plugins are highly unstable and will only work with a nightly Rust for now. Since stable Rust is backwards compatible, you should be able to compile your stable programs with nightly Rust with clippy plugged in to circumvent this.
Add in your Cargo.toml
:
[dependencies.clippy]
git = "https://github.com/Manishearth/rust-clippy"
Sample main.rs
:
#![feature(plugin)]
#![plugin(clippy)]
fn main(){
let x = Some(1u8);
match x {
Some(y) => println!("{:?}", y),
_ => ()
}
}
Produce this warning:
src/main.rs:8:5: 11:6 warning: You seem to be trying to use match for destructuring a single type. Did you mean to use `if let`?, #[warn(single_match)] on by default
src/main.rs:8 match x {
src/main.rs:9 Some(y) => println!("{:?}", y),
src/main.rs:10 _ => ()
src/main.rs:11 }
src/main.rs:8:5: 11:6 help: Try
if let Some(y) = x { println!("{:?}", y) }
You can add options to allow
/warn
/deny
:
- the whole set using the
clippy
lint group (#![deny(clippy)]
, etc) - only some lints (
#![deny(single_match, box_vec)]
, etc) allow
/warn
/deny
can be limited to a single function or module using#[allow(...)]
, etc
Note: deny
produces errors instead of warnings
To have cargo compile your crate with clippy without needing #![plugin(clippy)]
in your code, you can use:
cargo rustc -- -L /path/to/clippy_so -Z extra-plugins=clippy
##License Licensed under MPL. If you're having issues with the license, let me know and I'll try to change it to something more permissive.