]> git.lizzy.rs Git - rust.git/blob - README.md
Clarify recco to install as a soft dependency
[rust.git] / README.md
1 # rust-clippy
2
3 [![Build Status](https://travis-ci.org/Manishearth/rust-clippy.svg?branch=master)](https://travis-ci.org/Manishearth/rust-clippy)
4 [![Clippy Linting Result](http://clippy.bashy.io/github/Manishearth/rust-clippy/master/badge.svg)](http://clippy.bashy.io/github/Manishearth/rust-clippy/master/log)
5 [![Current Version](http://meritbadge.herokuapp.com/clippy)](https://crates.io/crates/clippy)
6 [![License: MPL-2.0](https://img.shields.io/crates/l/clippy.svg)](#License)
7
8 A collection of lints to catch common mistakes and improve your Rust code.
9
10 Table of contents:
11
12 *   [Lint list](#lints)
13 *   [Usage instructions](#usage)
14 *   [Configuration](#configuration)
15 *   [*clippy-service*](#link-with-clippy-service)
16 *   [License](#license)
17
18 ## Usage
19
20 Since this is a tool for helping the developer of a library or application
21 write better code, it is recommended to include clippy as an optional
22 dependency.
23
24 As a general rule clippy will only work with the *latest* Rust nightly for now.
25
26 ### Optional dependency
27
28 If you want to make clippy an optional dependency, you can do the following:
29
30 In your `Cargo.toml`:
31
32 ```toml
33 [dependencies]
34 clippy = {version = "*", optional = true}
35
36 [features]
37 default = []
38 ```
39
40 And, in your `main.rs` or `lib.rs`:
41
42 ```rust
43 #![cfg_attr(feature="clippy", feature(plugin))]
44
45 #![cfg_attr(feature="clippy", plugin(clippy))]
46 ```
47
48 Then build by enabling the feature: `cargo build --features "clippy"`
49
50 Instead of adding the `cfg_attr` attributes you can also run clippy on demand:
51 `cargo rustc --features clippy -- -Z no-trans -Z extra-plugins=clippy`
52 (the `-Z no trans`, while not neccessary, will stop the compilation process after
53 typechecking (and lints) have completed, which can significantly reduce the runtime).
54
55 ### As a Compiler Plugin
56
57 Since stable Rust is backwards compatible, you should be able to
58 compile your stable programs with nightly Rust with clippy plugged in to
59 circumvent this.
60
61 Add in your `Cargo.toml`:
62
63 ```toml
64 [dependencies]
65 clippy = "*"
66 ```
67
68 You then need to add `#![feature(plugin)]` and `#![plugin(clippy)]` to the top
69 of your crate entry point (`main.rs` or `lib.rs`).
70
71 Sample `main.rs`:
72
73 ```rust
74 #![feature(plugin)]
75
76 #![plugin(clippy)]
77
78
79 fn main(){
80     let x = Some(1u8);
81     match x {
82         Some(y) => println!("{:?}", y),
83         _ => ()
84     }
85 }
86 ```
87
88 Produces this warning:
89
90 ```terminal
91 src/main.rs:8:5: 11:6 warning: you seem to be trying to use match for destructuring a single type. Consider using `if let`, #[warn(single_match)] on by default
92 src/main.rs:8     match x {
93 src/main.rs:9         Some(y) => println!("{:?}", y),
94 src/main.rs:10         _ => ()
95 src/main.rs:11     }
96 src/main.rs:8:5: 11:6 help: Try
97 if let Some(y) = x { println!("{:?}", y) }
98 ```
99
100 ### As a cargo subcommand (`cargo clippy`)
101
102 An alternate way to use clippy is by installing clippy through cargo as a cargo
103 subcommand.
104
105 ```terminal
106 cargo install clippy
107 ```
108
109 Now you can run clippy by invoking `cargo clippy`, or
110 `rustup run nightly cargo clippy` directly from a directory that is usually
111 compiled with stable.
112
113 In case you are not using rustup, you need to set the environment flag
114 `SYSROOT` during installation so clippy knows where to find `librustc` and
115 similar crates.
116
117 ```terminal
118 SYSROOT=/path/to/rustc/sysroot cargo install clippy
119 ```
120
121 ### Running clippy from the command line without installing
122
123 To have cargo compile your crate with clippy without needing `#![plugin(clippy)]`
124 in your code, you can use:
125
126 ```terminal
127 cargo rustc -- -L /path/to/clippy_so -Z extra-plugins=clippy
128 ```
129
130 *[Note](https://github.com/Manishearth/rust-clippy/wiki#a-word-of-warning):*
131 Be sure that clippy was compiled with the same version of rustc that cargo invokes here!
132
133
134 ## Configuration
135
136 Some lints can be configured in a `clippy.toml` file. It contains basic `variable = value` mapping eg.
137
138 ```toml
139 blacklisted-names = ["toto", "tata", "titi"]
140 cyclomatic-complexity-threshold = 30
141 ```
142
143 See the wiki for more information about which lints can be configured and the
144 meaning of the variables.
145
146 You can also specify the path to the configuration file with:
147
148 ```rust
149 #![plugin(clippy(conf_file="path/to/clippy's/configuration"))]
150 ```
151
152 To deactivate the “for further information visit *wiki-link*” message you can
153 define the `CLIPPY_DISABLE_WIKI_LINKS` environment variable.
154
155 ### Allowing/denying lints
156
157 You can add options  to `allow`/`warn`/`deny`:
158
159 *   the whole set of `Warn` lints using the `clippy` lint group (`#![deny(clippy)]`)
160
161 *   all lints using both the `clippy` and `clippy_pedantic` lint groups (`#![deny(clippy)]`,
162     `#![deny(clippy_pedantic)]`). Note that `clippy_pedantic` contains some very aggressive
163     lints prone to false positives.
164
165 *   only some lints (`#![deny(single_match, box_vec)]`, etc)
166
167 *   `allow`/`warn`/`deny` can be limited to a single function or module using `#[allow(...)]`, etc
168
169 Note: `deny` produces errors instead of warnings.
170
171 For convenience, `cargo clippy` automatically defines a `cargo-clippy`
172 features. This lets you set lints level and compile with or without clippy
173 transparently:
174
175 ```rust
176 #[cfg_attr(feature = "cargo-clippy", allow(needless_lifetimes))]
177 ```
178
179 ## Link with clippy service
180
181 `clippy-service` is a rust web initiative providing `rust-clippy` as a web service.
182
183 Both projects are independent and maintained by different people
184 (even if some `clippy-service`'s contributions are authored by some `rust-clippy` members).
185
186 You can check out this great service at [clippy.bashy.io](https://clippy.bashy.io/).
187
188 ## Lints
189
190 There are 177 lints included in this crate:
191
192 name                                                                                                                   | default | triggers on
193 -----------------------------------------------------------------------------------------------------------------------|---------|----------------------------------------------------------------------------------------------------------------------------------
194 [absurd_extreme_comparisons](https://github.com/Manishearth/rust-clippy/wiki#absurd_extreme_comparisons)               | warn    | a comparison with a maximum or minimum value that is always true or false
195 [almost_swapped](https://github.com/Manishearth/rust-clippy/wiki#almost_swapped)                                       | warn    | `foo = bar; bar = foo` sequence
196 [approx_constant](https://github.com/Manishearth/rust-clippy/wiki#approx_constant)                                     | warn    | the approximate of a known float constant (in `std::fXX::consts`)
197 [assign_op_pattern](https://github.com/Manishearth/rust-clippy/wiki#assign_op_pattern)                                 | warn    | assigning the result of an operation on a variable to that same variable
198 [assign_ops](https://github.com/Manishearth/rust-clippy/wiki#assign_ops)                                               | allow   | any compound assignment operation
199 [bad_bit_mask](https://github.com/Manishearth/rust-clippy/wiki#bad_bit_mask)                                           | warn    | expressions of the form `_ & mask == select` that will only ever return `true` or `false`
200 [blacklisted_name](https://github.com/Manishearth/rust-clippy/wiki#blacklisted_name)                                   | warn    | usage of a blacklisted/placeholder name
201 [block_in_if_condition_expr](https://github.com/Manishearth/rust-clippy/wiki#block_in_if_condition_expr)               | warn    | braces that can be eliminated in conditions, e.g `if { true } ...`
202 [block_in_if_condition_stmt](https://github.com/Manishearth/rust-clippy/wiki#block_in_if_condition_stmt)               | warn    | complex blocks in conditions, e.g. `if { let x = true; x } ...`
203 [bool_comparison](https://github.com/Manishearth/rust-clippy/wiki#bool_comparison)                                     | warn    | comparing a variable to a boolean, e.g. `if x == true`
204 [box_vec](https://github.com/Manishearth/rust-clippy/wiki#box_vec)                                                     | warn    | usage of `Box<Vec<T>>`, vector elements are already on the heap
205 [boxed_local](https://github.com/Manishearth/rust-clippy/wiki#boxed_local)                                             | warn    | using `Box<T>` where unnecessary
206 [builtin_type_shadow](https://github.com/Manishearth/rust-clippy/wiki#builtin_type_shadow)                             | warn    | shadowing a builtin type
207 [cast_possible_truncation](https://github.com/Manishearth/rust-clippy/wiki#cast_possible_truncation)                   | allow   | casts that may cause truncation of the value, e.g `x as u8` where `x: u32`, or `x as i32` where `x: f32`
208 [cast_possible_wrap](https://github.com/Manishearth/rust-clippy/wiki#cast_possible_wrap)                               | allow   | casts that may cause wrapping around the value, e.g `x as i32` where `x: u32` and `x > i32::MAX`
209 [cast_precision_loss](https://github.com/Manishearth/rust-clippy/wiki#cast_precision_loss)                             | allow   | casts that cause loss of precision, e.g `x as f32` where `x: u64`
210 [cast_sign_loss](https://github.com/Manishearth/rust-clippy/wiki#cast_sign_loss)                                       | allow   | casts from signed types to unsigned types, e.g `x as u32` where `x: i32`
211 [char_lit_as_u8](https://github.com/Manishearth/rust-clippy/wiki#char_lit_as_u8)                                       | warn    | casting a character literal to u8
212 [chars_next_cmp](https://github.com/Manishearth/rust-clippy/wiki#chars_next_cmp)                                       | warn    | using `.chars().next()` to check if a string starts with a char
213 [clone_double_ref](https://github.com/Manishearth/rust-clippy/wiki#clone_double_ref)                                   | warn    | using `clone` on `&&T`
214 [clone_on_copy](https://github.com/Manishearth/rust-clippy/wiki#clone_on_copy)                                         | warn    | using `clone` on a `Copy` type
215 [cmp_nan](https://github.com/Manishearth/rust-clippy/wiki#cmp_nan)                                                     | deny    | comparisons to NAN, which will always return false, probably not intended
216 [cmp_null](https://github.com/Manishearth/rust-clippy/wiki#cmp_null)                                                   | warn    | comparing a pointer to a null pointer, suggesting to use `.is_null()` instead.
217 [cmp_owned](https://github.com/Manishearth/rust-clippy/wiki#cmp_owned)                                                 | warn    | creating owned instances for comparing with others, e.g. `x == "foo".to_string()`
218 [collapsible_if](https://github.com/Manishearth/rust-clippy/wiki#collapsible_if)                                       | warn    | `if`s that can be collapsed (e.g. `if x { if y { ... } }` and `else { if x { ... } }`)
219 [crosspointer_transmute](https://github.com/Manishearth/rust-clippy/wiki#crosspointer_transmute)                       | warn    | transmutes that have to or from types that are a pointer to the other
220 [cyclomatic_complexity](https://github.com/Manishearth/rust-clippy/wiki#cyclomatic_complexity)                         | warn    | functions that should be split up into multiple functions
221 [deprecated_semver](https://github.com/Manishearth/rust-clippy/wiki#deprecated_semver)                                 | warn    | use of `#[deprecated(since = "x")]` where x is not semver
222 [derive_hash_xor_eq](https://github.com/Manishearth/rust-clippy/wiki#derive_hash_xor_eq)                               | warn    | deriving `Hash` but implementing `PartialEq` explicitly
223 [diverging_sub_expression](https://github.com/Manishearth/rust-clippy/wiki#diverging_sub_expression)                   | warn    | whether an expression contains a diverging sub expression
224 [doc_markdown](https://github.com/Manishearth/rust-clippy/wiki#doc_markdown)                                           | warn    | presence of `_`, `::` or camel-case outside backticks in documentation
225 [double_neg](https://github.com/Manishearth/rust-clippy/wiki#double_neg)                                               | warn    | `--x`, which is a double negation of `x` and not a pre-decrement as in C/C++
226 [drop_ref](https://github.com/Manishearth/rust-clippy/wiki#drop_ref)                                                   | warn    | calls to `std::mem::drop` with a reference instead of an owned value
227 [duplicate_underscore_argument](https://github.com/Manishearth/rust-clippy/wiki#duplicate_underscore_argument)         | warn    | function arguments having names which only differ by an underscore
228 [empty_loop](https://github.com/Manishearth/rust-clippy/wiki#empty_loop)                                               | warn    | empty `loop {}`, which should block or sleep
229 [enum_clike_unportable_variant](https://github.com/Manishearth/rust-clippy/wiki#enum_clike_unportable_variant)         | warn    | C-like enums that are `repr(isize/usize)` and have values that don't fit into an `i32`
230 [enum_glob_use](https://github.com/Manishearth/rust-clippy/wiki#enum_glob_use)                                         | allow   | use items that import all variants of an enum
231 [enum_variant_names](https://github.com/Manishearth/rust-clippy/wiki#enum_variant_names)                               | warn    | enums where all variants share a prefix/postfix
232 [eq_op](https://github.com/Manishearth/rust-clippy/wiki#eq_op)                                                         | warn    | equal operands on both sides of a comparison or bitwise combination (e.g. `x == x`)
233 [eval_order_dependence](https://github.com/Manishearth/rust-clippy/wiki#eval_order_dependence)                         | warn    | whether a variable read occurs before a write depends on sub-expression evaluation order
234 [expl_impl_clone_on_copy](https://github.com/Manishearth/rust-clippy/wiki#expl_impl_clone_on_copy)                     | warn    | implementing `Clone` explicitly on `Copy` types
235 [explicit_counter_loop](https://github.com/Manishearth/rust-clippy/wiki#explicit_counter_loop)                         | warn    | for-looping with an explicit counter when `_.enumerate()` would do
236 [explicit_into_iter_loop](https://github.com/Manishearth/rust-clippy/wiki#explicit_into_iter_loop)                     | warn    | for-looping over `_.into_iter()` when `_` would do
237 [explicit_iter_loop](https://github.com/Manishearth/rust-clippy/wiki#explicit_iter_loop)                               | warn    | for-looping over `_.iter()` or `_.iter_mut()` when `&_` or `&mut _` would do
238 [extend_from_slice](https://github.com/Manishearth/rust-clippy/wiki#extend_from_slice)                                 | warn    | `.extend_from_slice(_)` is a faster way to extend a Vec by a slice
239 [filter_map](https://github.com/Manishearth/rust-clippy/wiki#filter_map)                                               | allow   | using combinations of `filter`, `map`, `filter_map` and `flat_map` which can usually be written as a single method call
240 [filter_next](https://github.com/Manishearth/rust-clippy/wiki#filter_next)                                             | warn    | using `filter(p).next()`, which is more succinctly expressed as `.find(p)`
241 [float_arithmetic](https://github.com/Manishearth/rust-clippy/wiki#float_arithmetic)                                   | allow   | any floating-point arithmetic statement
242 [float_cmp](https://github.com/Manishearth/rust-clippy/wiki#float_cmp)                                                 | warn    | using `==` or `!=` on float values instead of comparing difference with an epsilon
243 [for_kv_map](https://github.com/Manishearth/rust-clippy/wiki#for_kv_map)                                               | warn    | looping on a map using `iter` when `keys` or `values` would do
244 [for_loop_over_option](https://github.com/Manishearth/rust-clippy/wiki#for_loop_over_option)                           | warn    | for-looping over an `Option`, which is more clearly expressed as an `if let`
245 [for_loop_over_result](https://github.com/Manishearth/rust-clippy/wiki#for_loop_over_result)                           | warn    | for-looping over a `Result`, which is more clearly expressed as an `if let`
246 [get_unwrap](https://github.com/Manishearth/rust-clippy/wiki#get_unwrap)                                               | warn    | using `.get().unwrap()` or `.get_mut().unwrap()` when using `[]` would work instead
247 [identity_op](https://github.com/Manishearth/rust-clippy/wiki#identity_op)                                             | warn    | using identity operations, e.g. `x + 0` or `y / 1`
248 [if_let_redundant_pattern_matching](https://github.com/Manishearth/rust-clippy/wiki#if_let_redundant_pattern_matching) | warn    | use the proper utility function avoiding an `if let`
249 [if_let_some_result](https://github.com/Manishearth/rust-clippy/wiki#if_let_some_result)                               | warn    | usage of `ok()` in `if let Some(pat)` statements is unnecessary, match on `Ok(pat)` instead
250 [if_not_else](https://github.com/Manishearth/rust-clippy/wiki#if_not_else)                                             | allow   | `if` branches that could be swapped so no negation operation is necessary on the condition
251 [if_same_then_else](https://github.com/Manishearth/rust-clippy/wiki#if_same_then_else)                                 | warn    | if with the same *then* and *else* blocks
252 [ifs_same_cond](https://github.com/Manishearth/rust-clippy/wiki#ifs_same_cond)                                         | warn    | consecutive `ifs` with the same condition
253 [indexing_slicing](https://github.com/Manishearth/rust-clippy/wiki#indexing_slicing)                                   | allow   | indexing/slicing usage
254 [ineffective_bit_mask](https://github.com/Manishearth/rust-clippy/wiki#ineffective_bit_mask)                           | warn    | expressions where a bit mask will be rendered useless by a comparison, e.g. `(x | 1) > 2`
255 [inline_always](https://github.com/Manishearth/rust-clippy/wiki#inline_always)                                         | warn    | use of `#[inline(always)]`
256 [integer_arithmetic](https://github.com/Manishearth/rust-clippy/wiki#integer_arithmetic)                               | allow   | any integer arithmetic statement
257 [invalid_regex](https://github.com/Manishearth/rust-clippy/wiki#invalid_regex)                                         | deny    | invalid regular expressions
258 [invalid_upcast_comparisons](https://github.com/Manishearth/rust-clippy/wiki#invalid_upcast_comparisons)               | allow   | a comparison involving an upcast which is always true or false
259 [items_after_statements](https://github.com/Manishearth/rust-clippy/wiki#items_after_statements)                       | allow   | blocks where an item comes after a statement
260 [iter_next_loop](https://github.com/Manishearth/rust-clippy/wiki#iter_next_loop)                                       | warn    | for-looping over `_.next()` which is probably not intended
261 [iter_nth](https://github.com/Manishearth/rust-clippy/wiki#iter_nth)                                                   | warn    | using `.iter().nth()` on a standard library type with O(1) element access
262 [iter_skip_next](https://github.com/Manishearth/rust-clippy/wiki#iter_skip_next)                                       | warn    | using `.skip(x).next()` on an iterator
263 [len_without_is_empty](https://github.com/Manishearth/rust-clippy/wiki#len_without_is_empty)                           | warn    | traits or impls with a public `len` method but no corresponding `is_empty` method
264 [len_zero](https://github.com/Manishearth/rust-clippy/wiki#len_zero)                                                   | warn    | checking `.len() == 0` or `.len() > 0` (or similar) when `.is_empty()` could be used instead
265 [let_and_return](https://github.com/Manishearth/rust-clippy/wiki#let_and_return)                                       | warn    | creating a let-binding and then immediately returning it like `let x = expr; x` at the end of a block
266 [let_unit_value](https://github.com/Manishearth/rust-clippy/wiki#let_unit_value)                                       | warn    | creating a let binding to a value of unit type, which usually can't be used afterwards
267 [linkedlist](https://github.com/Manishearth/rust-clippy/wiki#linkedlist)                                               | warn    | usage of LinkedList, usually a vector is faster, or a more specialized data structure like a VecDeque
268 [logic_bug](https://github.com/Manishearth/rust-clippy/wiki#logic_bug)                                                 | warn    | boolean expressions that contain terminals which can be eliminated
269 [manual_swap](https://github.com/Manishearth/rust-clippy/wiki#manual_swap)                                             | warn    | manual swap of two variables
270 [many_single_char_names](https://github.com/Manishearth/rust-clippy/wiki#many_single_char_names)                       | warn    | too many single character bindings
271 [map_clone](https://github.com/Manishearth/rust-clippy/wiki#map_clone)                                                 | warn    | using `.map(|x| x.clone())` to clone an iterator or option's contents
272 [map_entry](https://github.com/Manishearth/rust-clippy/wiki#map_entry)                                                 | warn    | use of `contains_key` followed by `insert` on a `HashMap` or `BTreeMap`
273 [match_bool](https://github.com/Manishearth/rust-clippy/wiki#match_bool)                                               | warn    | a match on a boolean expression instead of an `if..else` block
274 [match_overlapping_arm](https://github.com/Manishearth/rust-clippy/wiki#match_overlapping_arm)                         | warn    | a match with overlapping arms
275 [match_ref_pats](https://github.com/Manishearth/rust-clippy/wiki#match_ref_pats)                                       | warn    | a match or `if let` with all arms prefixed with `&` instead of deref-ing the match expression
276 [match_same_arms](https://github.com/Manishearth/rust-clippy/wiki#match_same_arms)                                     | warn    | `match` with identical arm bodies
277 [mem_forget](https://github.com/Manishearth/rust-clippy/wiki#mem_forget)                                               | allow   | `mem::forget` usage on `Drop` types, likely to cause memory leaks
278 [min_max](https://github.com/Manishearth/rust-clippy/wiki#min_max)                                                     | warn    | `min(_, max(_, _))` (or vice versa) with bounds clamping the result to a constant
279 [misrefactored_assign_op](https://github.com/Manishearth/rust-clippy/wiki#misrefactored_assign_op)                     | warn    | having a variable on both sides of an assign op
280 [missing_docs_in_private_items](https://github.com/Manishearth/rust-clippy/wiki#missing_docs_in_private_items)         | allow   | detects missing documentation for public and private members
281 [mixed_case_hex_literals](https://github.com/Manishearth/rust-clippy/wiki#mixed_case_hex_literals)                     | warn    | hex literals whose letter digits are not consistently upper- or lowercased
282 [module_inception](https://github.com/Manishearth/rust-clippy/wiki#module_inception)                                   | warn    | modules that have the same name as their parent module
283 [modulo_one](https://github.com/Manishearth/rust-clippy/wiki#modulo_one)                                               | warn    | taking a number modulo 1, which always returns 0
284 [mut_mut](https://github.com/Manishearth/rust-clippy/wiki#mut_mut)                                                     | allow   | usage of double-mut refs, e.g. `&mut &mut ...`
285 [mutex_atomic](https://github.com/Manishearth/rust-clippy/wiki#mutex_atomic)                                           | warn    | using a mutex where an atomic value could be used instead
286 [mutex_integer](https://github.com/Manishearth/rust-clippy/wiki#mutex_integer)                                         | allow   | using a mutex for an integer type
287 [needless_bool](https://github.com/Manishearth/rust-clippy/wiki#needless_bool)                                         | warn    | if-statements with plain booleans in the then- and else-clause, e.g. `if p { true } else { false }`
288 [needless_borrow](https://github.com/Manishearth/rust-clippy/wiki#needless_borrow)                                     | warn    | taking a reference that is going to be automatically dereferenced
289 [needless_lifetimes](https://github.com/Manishearth/rust-clippy/wiki#needless_lifetimes)                               | warn    | using explicit lifetimes for references in function arguments when elision rules would allow omitting them
290 [needless_range_loop](https://github.com/Manishearth/rust-clippy/wiki#needless_range_loop)                             | warn    | for-looping over a range of indices where an iterator over items would do
291 [needless_return](https://github.com/Manishearth/rust-clippy/wiki#needless_return)                                     | warn    | using a return statement like `return expr;` where an expression would suffice
292 [needless_update](https://github.com/Manishearth/rust-clippy/wiki#needless_update)                                     | warn    | using `Foo { ..base }` when there are no missing fields
293 [neg_multiply](https://github.com/Manishearth/rust-clippy/wiki#neg_multiply)                                           | warn    | multiplying integers with -1
294 [new_ret_no_self](https://github.com/Manishearth/rust-clippy/wiki#new_ret_no_self)                                     | warn    | not returning `Self` in a `new` method
295 [new_without_default](https://github.com/Manishearth/rust-clippy/wiki#new_without_default)                             | warn    | `fn new() -> Self` method without `Default` implementation
296 [new_without_default_derive](https://github.com/Manishearth/rust-clippy/wiki#new_without_default_derive)               | warn    | `fn new() -> Self` without `#[derive]`able `Default` implementation
297 [no_effect](https://github.com/Manishearth/rust-clippy/wiki#no_effect)                                                 | warn    | statements with no effect
298 [non_ascii_literal](https://github.com/Manishearth/rust-clippy/wiki#non_ascii_literal)                                 | allow   | using any literal non-ASCII chars in a string literal instead of using the `\\u` escape
299 [nonminimal_bool](https://github.com/Manishearth/rust-clippy/wiki#nonminimal_bool)                                     | allow   | boolean expressions that can be written more concisely
300 [nonsensical_open_options](https://github.com/Manishearth/rust-clippy/wiki#nonsensical_open_options)                   | warn    | nonsensical combination of options for opening a file
301 [not_unsafe_ptr_arg_deref](https://github.com/Manishearth/rust-clippy/wiki#not_unsafe_ptr_arg_deref)                   | warn    | public functions dereferencing raw pointer arguments but not marked `unsafe`
302 [ok_expect](https://github.com/Manishearth/rust-clippy/wiki#ok_expect)                                                 | warn    | using `ok().expect()`, which gives worse error messages than calling `expect` directly on the Result
303 [option_map_unwrap_or](https://github.com/Manishearth/rust-clippy/wiki#option_map_unwrap_or)                           | allow   | using `Option.map(f).unwrap_or(a)`, which is more succinctly expressed as `map_or(a, f)`
304 [option_map_unwrap_or_else](https://github.com/Manishearth/rust-clippy/wiki#option_map_unwrap_or_else)                 | allow   | using `Option.map(f).unwrap_or_else(g)`, which is more succinctly expressed as `map_or_else(g, f)`
305 [option_unwrap_used](https://github.com/Manishearth/rust-clippy/wiki#option_unwrap_used)                               | allow   | using `Option.unwrap()`, which should at least get a better message using `expect()`
306 [or_fun_call](https://github.com/Manishearth/rust-clippy/wiki#or_fun_call)                                             | warn    | using any `*or` method with a function call, which suggests `*or_else`
307 [out_of_bounds_indexing](https://github.com/Manishearth/rust-clippy/wiki#out_of_bounds_indexing)                       | deny    | out of bounds constant indexing
308 [overflow_check_conditional](https://github.com/Manishearth/rust-clippy/wiki#overflow_check_conditional)               | warn    | overflow checks inspired by C which are likely to panic
309 [panic_params](https://github.com/Manishearth/rust-clippy/wiki#panic_params)                                           | warn    | missing parameters in `panic!` calls
310 [partialeq_ne_impl](https://github.com/Manishearth/rust-clippy/wiki#partialeq_ne_impl)                                 | warn    | re-implementing `PartialEq::ne`
311 [precedence](https://github.com/Manishearth/rust-clippy/wiki#precedence)                                               | warn    | operations where precedence may be unclear
312 [print_stdout](https://github.com/Manishearth/rust-clippy/wiki#print_stdout)                                           | allow   | printing on stdout
313 [print_with_newline](https://github.com/Manishearth/rust-clippy/wiki#print_with_newline)                               | warn    | using `print!()` with a format string that ends in a newline
314 [ptr_arg](https://github.com/Manishearth/rust-clippy/wiki#ptr_arg)                                                     | warn    | fn arguments of the type `&Vec<...>` or `&String`, suggesting to use `&[...]` or `&str` instead, respectively
315 [range_step_by_zero](https://github.com/Manishearth/rust-clippy/wiki#range_step_by_zero)                               | warn    | using `Range::step_by(0)`, which produces an infinite iterator
316 [range_zip_with_len](https://github.com/Manishearth/rust-clippy/wiki#range_zip_with_len)                               | warn    | zipping iterator with a range when `enumerate()` would do
317 [redundant_closure](https://github.com/Manishearth/rust-clippy/wiki#redundant_closure)                                 | warn    | redundant closures, i.e. `|a| foo(a)` (which can be written as just `foo`)
318 [redundant_closure_call](https://github.com/Manishearth/rust-clippy/wiki#redundant_closure_call)                       | warn    | throwaway closures called in the expression they are defined
319 [redundant_pattern](https://github.com/Manishearth/rust-clippy/wiki#redundant_pattern)                                 | warn    | using `name @ _` in a pattern
320 [regex_macro](https://github.com/Manishearth/rust-clippy/wiki#regex_macro)                                             | warn    | use of `regex!(_)` instead of `Regex::new(_)`
321 [result_unwrap_used](https://github.com/Manishearth/rust-clippy/wiki#result_unwrap_used)                               | allow   | using `Result.unwrap()`, which might be better handled
322 [reverse_range_loop](https://github.com/Manishearth/rust-clippy/wiki#reverse_range_loop)                               | warn    | iteration over an empty range, such as `10..0` or `5..5`
323 [search_is_some](https://github.com/Manishearth/rust-clippy/wiki#search_is_some)                                       | warn    | using an iterator search followed by `is_some()`, which is more succinctly expressed as a call to `any()`
324 [serde_api_misuse](https://github.com/Manishearth/rust-clippy/wiki#serde_api_misuse)                                   | warn    | various things that will negatively affect your serde experience
325 [shadow_reuse](https://github.com/Manishearth/rust-clippy/wiki#shadow_reuse)                                           | allow   | rebinding a name to an expression that re-uses the original value, e.g. `let x = x + 1`
326 [shadow_same](https://github.com/Manishearth/rust-clippy/wiki#shadow_same)                                             | allow   | rebinding a name to itself, e.g. `let mut x = &mut x`
327 [shadow_unrelated](https://github.com/Manishearth/rust-clippy/wiki#shadow_unrelated)                                   | allow   | rebinding a name without even using the original value
328 [should_implement_trait](https://github.com/Manishearth/rust-clippy/wiki#should_implement_trait)                       | warn    | defining a method that should be implementing a std trait
329 [similar_names](https://github.com/Manishearth/rust-clippy/wiki#similar_names)                                         | allow   | similarly named items and bindings
330 [single_char_pattern](https://github.com/Manishearth/rust-clippy/wiki#single_char_pattern)                             | warn    | using a single-character str where a char could be used, e.g. `_.split("x")`
331 [single_match](https://github.com/Manishearth/rust-clippy/wiki#single_match)                                           | warn    | a match statement with a single nontrivial arm (i.e, where the other arm is `_ => {}`) instead of `if let`
332 [single_match_else](https://github.com/Manishearth/rust-clippy/wiki#single_match_else)                                 | allow   | a match statement with a two arms where the second arm's pattern is a wildcard instead of `if let`
333 [string_add](https://github.com/Manishearth/rust-clippy/wiki#string_add)                                               | allow   | using `x + ..` where x is a `String` instead of `push_str()`
334 [string_add_assign](https://github.com/Manishearth/rust-clippy/wiki#string_add_assign)                                 | allow   | using `x = x + ..` where x is a `String` instead of `push_str()`
335 [string_lit_as_bytes](https://github.com/Manishearth/rust-clippy/wiki#string_lit_as_bytes)                             | warn    | calling `as_bytes` on a string literal instead of using a byte string literal
336 [stutter](https://github.com/Manishearth/rust-clippy/wiki#stutter)                                                     | allow   | type names prefixed/postfixed with their containing module's name
337 [suspicious_assignment_formatting](https://github.com/Manishearth/rust-clippy/wiki#suspicious_assignment_formatting)   | warn    | suspicious formatting of `*=`, `-=` or `!=`
338 [suspicious_else_formatting](https://github.com/Manishearth/rust-clippy/wiki#suspicious_else_formatting)               | warn    | suspicious formatting of `else if`
339 [temporary_assignment](https://github.com/Manishearth/rust-clippy/wiki#temporary_assignment)                           | warn    | assignments to temporaries
340 [temporary_cstring_as_ptr](https://github.com/Manishearth/rust-clippy/wiki#temporary_cstring_as_ptr)                   | warn    | getting the inner pointer of a temporary `CString`
341 [too_many_arguments](https://github.com/Manishearth/rust-clippy/wiki#too_many_arguments)                               | warn    | functions with too many arguments
342 [toplevel_ref_arg](https://github.com/Manishearth/rust-clippy/wiki#toplevel_ref_arg)                                   | warn    | an entire binding declared as `ref`, in a function argument or a `let` statement
343 [transmute_ptr_to_ref](https://github.com/Manishearth/rust-clippy/wiki#transmute_ptr_to_ref)                           | warn    | transmutes from a pointer to a reference type
344 [trivial_regex](https://github.com/Manishearth/rust-clippy/wiki#trivial_regex)                                         | warn    | trivial regular expressions
345 [type_complexity](https://github.com/Manishearth/rust-clippy/wiki#type_complexity)                                     | warn    | usage of very complex types that might be better factored into `type` definitions
346 [unicode_not_nfc](https://github.com/Manishearth/rust-clippy/wiki#unicode_not_nfc)                                     | allow   | using a unicode literal not in NFC normal form (see [unicode tr15](http://www.unicode.org/reports/tr15/) for further information)
347 [unit_cmp](https://github.com/Manishearth/rust-clippy/wiki#unit_cmp)                                                   | warn    | comparing unit values
348 [unnecessary_mut_passed](https://github.com/Manishearth/rust-clippy/wiki#unnecessary_mut_passed)                       | warn    | an argument passed as a mutable reference although the callee only demands an immutable reference
349 [unnecessary_operation](https://github.com/Manishearth/rust-clippy/wiki#unnecessary_operation)                         | warn    | outer expressions with no effect
350 [unneeded_field_pattern](https://github.com/Manishearth/rust-clippy/wiki#unneeded_field_pattern)                       | warn    | struct fields bound to a wildcard instead of using `..`
351 [unsafe_removed_from_name](https://github.com/Manishearth/rust-clippy/wiki#unsafe_removed_from_name)                   | warn    | `unsafe` removed from API names on import
352 [unseparated_literal_suffix](https://github.com/Manishearth/rust-clippy/wiki#unseparated_literal_suffix)               | allow   | literals whose suffix is not separated by an underscore
353 [unused_collect](https://github.com/Manishearth/rust-clippy/wiki#unused_collect)                                       | warn    | `collect()`ing an iterator without using the result; this is usually better written as a for loop
354 [unused_label](https://github.com/Manishearth/rust-clippy/wiki#unused_label)                                           | warn    | unused labels
355 [unused_lifetimes](https://github.com/Manishearth/rust-clippy/wiki#unused_lifetimes)                                   | warn    | unused lifetimes in function definitions
356 [use_debug](https://github.com/Manishearth/rust-clippy/wiki#use_debug)                                                 | allow   | use of `Debug`-based formatting
357 [used_underscore_binding](https://github.com/Manishearth/rust-clippy/wiki#used_underscore_binding)                     | allow   | using a binding which is prefixed with an underscore
358 [useless_attribute](https://github.com/Manishearth/rust-clippy/wiki#useless_attribute)                                 | warn    | use of lint attributes on `extern crate` items
359 [useless_format](https://github.com/Manishearth/rust-clippy/wiki#useless_format)                                       | warn    | useless use of `format!`
360 [useless_let_if_seq](https://github.com/Manishearth/rust-clippy/wiki#useless_let_if_seq)                               | warn    | unidiomatic `let mut` declaration followed by initialization in `if`
361 [useless_transmute](https://github.com/Manishearth/rust-clippy/wiki#useless_transmute)                                 | warn    | transmutes that have the same to and from types or could be a cast/coercion
362 [useless_vec](https://github.com/Manishearth/rust-clippy/wiki#useless_vec)                                             | warn    | useless `vec!`
363 [while_let_loop](https://github.com/Manishearth/rust-clippy/wiki#while_let_loop)                                       | warn    | `loop { if let { ... } else break }`, which can be written as a `while let` loop
364 [while_let_on_iterator](https://github.com/Manishearth/rust-clippy/wiki#while_let_on_iterator)                         | warn    | using a while-let loop instead of a for loop on an iterator
365 [wrong_pub_self_convention](https://github.com/Manishearth/rust-clippy/wiki#wrong_pub_self_convention)                 | allow   | defining a public method named with an established prefix (like "into_") that takes `self` with the wrong convention
366 [wrong_self_convention](https://github.com/Manishearth/rust-clippy/wiki#wrong_self_convention)                         | warn    | defining a method named with an established prefix (like "into_") that takes `self` with the wrong convention
367 [wrong_transmute](https://github.com/Manishearth/rust-clippy/wiki#wrong_transmute)                                     | warn    | transmutes that are confusing at best, undefined behaviour at worst and always useless
368 [zero_divided_by_zero](https://github.com/Manishearth/rust-clippy/wiki#zero_divided_by_zero)                           | warn    | usage of `0.0 / 0.0` to obtain NaN instead of std::f32::NaN or std::f64::NaN
369 [zero_prefixed_literal](https://github.com/Manishearth/rust-clippy/wiki#zero_prefixed_literal)                         | warn    | integer literals starting with `0`
370 [zero_width_space](https://github.com/Manishearth/rust-clippy/wiki#zero_width_space)                                   | deny    | using a zero-width space in a string literal, which is confusing
371
372 More to come, please [file an issue](https://github.com/Manishearth/rust-clippy/issues) if you have ideas!
373
374 ## License
375
376 Licensed under [MPL](https://www.mozilla.org/MPL/2.0/).
377 If you're having issues with the license, let me know and I'll try to change it to something more permissive.