Lint

C/C++ compilers can issue many useful warnings but the amount of static analysis they can do is usually quite limited.

The Rust compiler performs a far more rigorous lifecycle check on data and then follows up with a lint check that inspects your code for potentially bad or erroneous

In particular it looks for:

  • Dead / unused code
  • Unreachable code
  • Deprecated methods
  • Undocumented functions
  • Camel case / snake case violations
  • Unbounded recursion code (i.e. no conditionals to stop recursion)
  • Use of heap memory when stack could be used
  • Unused extern crates, imports, variables, attributes, mut, parentheses
  • Using “while true {}” instead of “loop {}”

Lint rules can be enforced more strictly or ignored by using attributes:

  1. #[allow(rule)]
  2. #[warn(rule)]
  3. #[deny(rule)]
  4. #[forbid(rule)]

A full list of lint rules can be found by typing “rustc -W help”:

  1. name default meaning
  2. ---- ------- -------
  3. box-pointers allow use of owned (Box type) heap memory
  4. fat-ptr-transmutes allow detects transmutes of fat pointers
  5. missing-copy-implementations allow detects potentially-forgotten implementations of `Copy`
  6. missing-debug-implementations allow detects missing implementations of fmt::Debug
  7. missing-docs allow detects missing documentation for public members
  8. trivial-casts allow detects trivial casts which could be removed
  9. trivial-numeric-casts allow detects trivial casts of numeric types which could be removed
  10. unsafe-code allow usage of `unsafe` code
  11. ...

There are a lot checks than are listed here.