Code Smells
Pre-requisites:
- Testing is setup
 
Warnings
Compiler warnings provide some basic checking for code smells.
There are many ways to check for warnings. We recommend the followig:
In each of your lib.rs, main.rs, and test .rs files:
#![warn(warnings)]
In .travis.yml:
matrix:
  include:
  - env: RUSTFLAGS="-D warnings"
    rust: 1.24.0  # `stable`: Locking down for consistent behavior
    script:
    - cargo check --tests
Highlights
- Doesn't slow people down during prototyping by turning warnings into errors.
 - Contributors see all warnings they will be accountable for due to 
warn(warnings). - Warning changes don't break the CI due to 
rust: 1.24.0 
A major downside of this:
- Only run on one target
 
See also example-warn.
Why Avoid The Simple Answer
The seemingly easy answer for checking for warnings is to either:
RUSTFLAGS="-D warnings" cargo build
or in each of your lib.rs, main.rs, and test .rs files:
# #![allow(unused_variables)] #![deny(warnings)] #fn main() { #}
The reason you don't want to do this in your CI process is that new versions of Rust can add and remove warnings, causing the build to break on your contributor's PR, frustrating and possibly alienating them.
Lints
Linters are extra tools for checking for code smells. They aren't regular warnings either because
- Slower to analyze
 - False positives
 
clippy is the standard linter for the Rust ecosystem.
See also example-clippy.
TravisCI
Like with rustfmt, you only need clippy running in one job
and we recommend running it on Travis rather than Appveyor because Travis
supports your jobs running in parallel.
We'll be adding the following to your .travis.yml:
matrix:
  include:
  - env: CLIPPY
    rust: nightly-2018-07-17
    install:
      - rustup component add clippy-preview
    script:
      - cargo clippy --all-features -- -D clippy
Highlights
matrix: include:is allowing us to define a complete one-off build job.- This will run in parallel to your tests, giving you quicker feedback.
 - No other job output will be in here, making it easier to see the results.
 
- Clippy changes don't break the CI due to pinning the nightly version