Rustのclippyについて調べてみた

はじめに

  • Rustのlinter(静的解析ツール)であるclippyですが、「そもそも変な書き方してたらコンパイラで警告してくれるし、必要なの??」と疑問に思い調べたので、自分への備忘録として記事にしました。

clippyとは

  • いわゆる静的解析ツール。コードを分析してよくある間違いを見つけ指摘してくれる
  • コンパイラ警告がカバーしない範囲の警告を出してくれる

    • どんな解析、警告を出してくれるかは下記に書かれている

      rust-lang.github.io

  • cargo clippy --fix--fixを追加すると自動的にコードを直してくれる

    • ただし、指摘した全てを直してくれるわけではない
    • cargo fixで修正されるものは全て修正してくれる(?)。cargo fixの上位互換かもしれない

fn main() {
    let x = 3.1415;
    let r = 8.0;
    println!("the area of the circle is {}", x * r * r);

    return;
}

上のコードに対してcargo clippyを実行すると下記が出力される

warning: unneeded `return` statement
 --> src\main.rs:6:5
  |
6 |     return;
  |     ^^^^^^^ help: remove `return`
  |
  = note: `#[warn(clippy::needless_return)]` on by default
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return

error: approximate value of `f{32, 64}::consts::PI` found
 --> src\main.rs:2:13
  |
2 |     let x = 3.1415;
  |             ^^^^^^
  |
  = note: `#[deny(clippy::approx_constant)]` on by default
  = help: consider using the constant directly
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#approx_constant

次にcargo clippy --fix(正確には、私の手元の環境で実施した時はcargo clippy --fix --allow-no-vcs)を実行すると、コードが下のように変更される

fn main() {
    let x = 3.1415;
    let r = 8.0;
    println!("the area of the circle is {}", x * r * r);

    
}

returnが不要ということで消してくれたのは良いけど、returnの文字列だけなので変な空白は残ってしまうみたいです。

ただ、この後にcargo fmtを実行することで残ってしまった余計な空白を取り除くことができます

さいごに

  • Rustの静的解析ツールであるclippyについて調査し、実際に使ってみました。
  • コンパイラで指摘するよりも多くのことを指摘してくれることが分かりました。
  • --fixをつけることで自動で修正する機能があることも分かりました。
    + しかし、指摘事項の全てを修正するわけではないことは注意すべきかもしれません。
    + 余計な空白が残ったりするので、実行後`cargo fmt`もセットで実行するのが良さそうです。