FindBugsを試してみた

FindBugs, Java

はじめに

社内で CIツール(Jenkins)の標準化を進めており、ビルド時にインスペクション(静的コード解析)を導入しようかと検討しています。
そこでどんなツールがあるか調べてみてFindBugsを実際に試してみました。

インスペクション

インスペクションツールには実行しないのでコンパイルせずにコードを解析しバグの可能性がある個所や品質を下げるコードをピックアップしてくれます。
またコーディング規約に沿っているかチェックするのもインスペクションにあたります。

インスペクションツール

Javaに対応しているインスペクションツールとしては以下のようなものがあります。

  • checkstyle
    • 定義したコーティング規約に沿っているか検査してくれます。
  • FindBugs
    • FindBugsで定義されているバグパターンと一致するコードを検知してくれます。
    • PMDにも同様の機能があるようですが、FindBugsの方がバグパターンが多いためこちらを使われることが多いようです。
  • PMD
    • コードの複雑性を検知してくれます。

FindBugsを試してみた

今回はIntelliJにプラグインをインストールして使用してみました。

インストール手順

  1. プラグインダウンロード
    1. https://plugins.jetbrains.com/plugin/3847-findbugs-idea から最新のプラグインをダウンロードします。
    2. (現在の最新バージョンは 1.0.1 です)
  2. プラグインインストール
    1. ダンロードしたファイルを解凍
    2. 解凍したファイルを /IntelliJ/Install/dir/plugin 以下にコピーする
  3. IntelliJを起動/再起動する

以上でインストール終わりです。

実際に使ってみる

使い方は簡単です。
1. IntelliJを起動しプロジェクトを開く
2. サイドバーのプロジェクトを右クリック
3. FindBugs->Analyze Project Filesを選択
4. 解析するか聞かれるので Yes を選択すると解析を始めます

解析結果の例 (定期決済のコードを解析してみました)

文字列結合に + を使っていたケース

以下ツールによって表示された詳細です。

このメソッドは、ループの中で + を使用して String を構築していると思われます。
各々の繰り返しにおいて、String は StringBuffer/StringBuilder に変換、追加され、String へ変換されます。
各々の繰り返しで文字列が再コピーされ、増大すると繰り返しの数で二次コストの原因になる可能性があります。

この問題については以下のような修正案が提示されました。

効率の悪いMapイテレータ

以下ツールによって表示された詳細です。

このメソッドは、keySet イテレータから取り出されたキーを使用して、マップエントリの値にアクセスしています。
Map の entrySet イテレータを使用したほうが Map.get(key) ルックアップを回避するのでより効率的です。

ツールによって表示された詳細については全てこちらに記載されています。
どんな項目をチェックしてくれるのかも確認することができます。

おわりに

初めて静的解析をしてみて、当初思っていたよりも簡単に解析できてしまったことにおどろきました。
Jenkinsにも静的解析のJobを追加して品質向上に役立てたいと思います。
ちなみにGradleやMavenなど主要なビルドつーるにはプラグインがあるようです。

この記事を書いた人

高橋克幸
高橋克幸
新卒2年目の準新人です。
趣味は 麻雀 プログラミング 音楽。
運動不足を感じているため、ダンスを始めようかと思っています。
最近書いた記事

FindBugs, Java