Javaプログラムの静的解析ツール「FindBugs」入門

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 本稿では、Javaプログラムの静的解析ツール「FindBugs」について説明します。

プログラムの静的解析とは何か?

 プログラムの静的解析とは、プログラムソースの中からバグが発生しそうな箇所や無駄な処理を発見する分析手法で、プログラムを実行せずに問題を発見・検知します。 (逆にプログラムを実行して問題を見つける手法は「動的解析」といいます) 例えば NullPointerException が発生する可能性がある箇所や、絶対に実行されない処理などを、問題となり得る箇所をプログラムを実行することなく発見してくれます。

 プログラムの不具合は、開発工程のできるだけ早いタイミングで見つかる方が良いことは言うまでもありません。 大人数で開発したプログラムを結合して動かすよりも個人で開発しているタイミングでバグが発見される方が良いですし、単体試験を行うよりもソースを書いている最中にバグを知れた方が良いですし、プログラムを実行してからよりも実行する前にバグを知れた方が助かります。

FindBugsとは?

 FindBugs は Java プログラムの静的解析ツールで、2006年に初版がリリースされてから10年以上の歴史を持つ定番のツールです。 FindBugs は、Java のプログラムコードから100種類以上のエラーを検知することができます。

 FindBugs は、スタンドアローンのGUIアプリケーションとして配布されていますが、それ以外にも様々なツールのプラグインとしても配布されています。 私の知る限り、スタンドアローンの FindBugs を利用している開発者は少なく、多くの開発者は開発で常用しているツールのプラグインを利用しているように思えます。 FindBugs には、Eclipse, NetBeans, IntelliJ IDEA, Jenkins, Ant, Maven などのプラグインがありますので、それらを使った方が便利でしょう。

どのようなバグが検知できるのか?

 前述の通り FindBugs では100種類以上のバグを検知することができます。 ここでは簡単な例で紹介したいと思います。 例えば次のようなメソッドを書いた場合、2つのことを警告してくれます。

private boolean isTom(String name) {
    if( name == null ) {
        new IllegalArgumentException("Method argument 'name' is null.");
    }
    return (name == "tom");
}

 このメソッドは引数の文字列が “Tom” という文字列かを判定するメソッドです。 メソッドのはじめに引数の null チェックをしているつもりですが、実は throw の記述が抜けています。 これにより FindBugs は「CORRECTNESS : RV_EXCEPTION_NOT_THROWN」という警告を出してくれて「new IllegalArgumentException(String) をスローしていません。」というメッセージと共に教えてくれます。

 また、文字列の比較方法も誤っており、本来であれば equals メソッドを使うべきです。 これも FindBugs が「BAD_PRACTICE : ES_COMPARING_PARAMETER_STRING_WITH_EQ」という警告を「String パラメータを == や != を使用して比較しています。」というメッセージと共に教えてくれます。

FindBugs が出力してくれる警告の種類については、公式サイトの「FindBugs Bug Descriptions」のページに全て記述されていますので参考にすると良いでしょう。

プロジェクト毎にルールを決めよう

 FindBugs は解析した Java プログラムの中から100種類以上の警告を発してくれますが、深刻なバグとなり得るものから、コーディングスタイルによっては問題にならないものまで、とても幅広く警告を発してくれます。 FindBugs で出力できる全ての警告を出力してそれを全て解決しようとすると途方も無く時間がかかってしまいますので、FindBugs を導入してすぐは「今後はこの警告は出力しない」「この警告は必要だ」と分別を行い、FindBugs に出力して欲しい警告の種類を絞っていき、プロジェクト毎に出力ルールを決定するのが良いでしょう。 FindBugs のオプションで、出力すべき警告を決定することができます。

FindBugs はプログラマを育てる

 FindBugs 導入の直接的なメリットは開発中のプロダクトのバグが見つかることですが、長期的な視点ではプログラマを育てられることもメリットであると思っています。 FindBugs を導入してすぐは、ありとあらゆるバグが報告されて、ストレスを感じたり凹んだりするかも知れません。 しかし FindBugs がどんなことをアラートにあげるのかを学習していくことで、次からは注意してプログラムをするようになるのでプログラムの品質が徐々に上がっていくことが期待できます。

チームの開発ルールに取り入れよう

 FindBugs のメリットについてご理解頂けたでしょうか? どんな規模の開発にでも導入するメリットがあると思いますが、特にチームで開発している場合は、是非プロジェクトの開発ルールとして取り入れることも検討してみてはいかがでしょうか。 開発者一人ひとりが定期的に FindBugs を実行するように啓蒙したり、FindBugsの結果もソースレビューの対象にするなど、プロジェクトごとに工夫すると良いでしょう。

おわりに

 本稿では FindBugs の概要について説明しました。 Java プログラムの品質担保のために、ぜひ FindBugs の導入を検討してみてください。

Java環境構築へ戻る

Javaのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca