導入と第一印象
SourceForge にある FindBugs のウェブサイトにアクセスして最初に気づくのは、その飾り気のないアカデミックなデザインです。ページは基本的にドキュメント、ダウンロード、開発セクションへのリンク集です。派手なマーケティングや価格ページはありません。FindBugs は Lesser GNU Public License のもとで完全に無料だからです。プロジェクトはメリーランド大学が主導しており、名称は商標登録されています。このオープンソースとしての出自は、すぐに信頼性を感じさせます。しかし、最新リリース(バージョン 3.0.1)は 2015 年 3 月と、かなり昔のものです。急速に進化する Java 開発の世界において、これは大きな警告サインと言えるでしょう。
テクノロジージャーナリストとして、私は長年にわたって何十もの静的解析ツールをテストしてきました。FindBugs のダウンロードページには、コマンドラインインターフェース、GUI、Ant タスクが用意されています。ワークフローを体感するために、GUI バージョンをダウンロードしました。インターフェースは簡素ですが機能的です。コンパイル済みの Java クラスや JAR ファイルを指定し、有効にするバグ検出器を選択して、実行するだけです。結果は階層ツリーで表示され、バグの種類と重大度ごとに分類されます。
FindBugs の仕組みとコア機能
FindBugs はバイトコード分析を実行します。ソースコードは必要ありません。Java クラスファイルをスキャンして、400 以上のバグパターン(潜在的なヌルポインタ参照から不適切な浮動小数点比較まで)を検出します。これは、コードを実行せずに検査するという、最も純粋な意味での「静的解析」ツールです。このツールは機械学習を使用しません。長年にわたり専門家がコード化した一連の決定論的ルールに依存しています。「テキストAI > AIプログラミング」というカテゴリ分けは、誤解を招くものだと感じます。FindBugs は AI ではなく、エキスパートシステムです。とはいえ、このレビューでは、自動コードレビュー支援ツールとして評価します。
3.0.1 リリースでは、DM_BOXED_PRIMITIVE_FOR_COMPARE や NP_OPTIONAL_RETURN_NULL などの新しいバグパターンが追加されました。これらのパターンがニーモニックコード(例:NP は NullPointer の略)でエンコードされていること自体が、このツールの古さと、内部者向けの設計思想を示しています。最近のツールは、より読みやすい説明文に移行しています。FindBugs は XML 設定によるフィルタリングもサポートしており、Maven、Eclipse、Jenkins などのビルドツールに統合できます。さらに、チームで問題レビューを共有できるクラウド機能もありました。2015年としては驚くほど先進的なコンセプトです。
Java 8 でコンパイルされた小さな Java プロジェクトでテストしたところ、FindBugs はいくつかの実際の問題を検出しました。メソッドが null を返した場合に発生する可能性のあるヌルポインタと、冗長な null チェックです。また、ボクシングとアンボクシングに関連するいくつかの誤検出もありました。応答時間は許容範囲内で、50 クラスで数秒でした。
強みと限界
FindBugs には否定できない強みがあります。無料であること、オープンソースであること、大規模な環境で実績があることです(Google は 2009 年に 700 名以上のエンジニアが参加したフィックスイットイベントで使用しました)。バグパターンは提供されているマニュアルでしっかりと文書化されています。Eclipse プラグインは今でも旧アップデートサイトからダウンロード可能です(ただし、最近の Eclipse バージョンでは動作しない可能性があります)。レガシーな Java 8 のコードベースをメンテナンスしている方にとって、FindBugs は今でもコストゼロの堅実な選択肢です。
しかし、その限界は深刻です。FindBugs は事実上、開発が放棄されたソフトウェア(アバンダンウェア)です。 最新リリースから 9 年以上が経過しています。Java 9 のモジュールシステム、レコードや sealed クラスなどの新しい言語機能、モダンなビルドツールチェーンをサポートしていません。ユーザーインターフェースは古臭く感じられます。たとえば、GUI は行番号以上のインラインコードナビゲーションを提供しません。最も重要なのは、コミュニティがすでに次のステップに進んでいることです。実際の後継である SpotBugs は、同じライセンスのもとで活発に開発が続けられているフォークです。SpotBugs は Java 17 までのサポートを追加し、新しい検出器も含まれています。もし今日新しいプロジェクトを始めるなら、SpotBugs か、セキュリティ分析に特化した商用版の FindSecBugs を強くお勧めします。
FindBugs を利用すべき人、利用すべきでない人
FindBugs は、レガシーな Java 8 アプリケーションをメンテナンスしており、追加のインフラをインストールせずに、手軽で無料の静的解析ツールを必要としている開発者に最適です。また、マニュアルの詳細なバグの説明は非常に質が高いため、古典的な Java のバグパターンを学ぶための学習リソースとしても役立ちます。しかし、新規開発や、Java 9 以降を使用するチームにはお勧めできません。そのような場合は、SpotBugs(直接的なフォーク)か、最新の Web UI と継続的な検査を提供する SonarQube(Java アナライザー付き)などの商用代替ツールを検討してください。無料ツールの中でも、PMD や Checkstyle はより活発にメンテナンスされており、より広範囲をカバーしています。
まとめると、FindBugs は歴史的に重要ですが、実用的には時代遅れです。そのコアとなる検出エンジンは、古い Java コードに対しては今でも機能します。しかし、アップデートの欠如と古臭いインターフェースは、現代のワークフローには適していません。どうしても Java 8 プロジェクト向けの無料の静的アナライザーが必要で、依存関係をアップグレードできない場合には動作するでしょう。そうでない場合は、SpotBugs への移行に数時間を投資することをお勧めします。後々の手間を大幅に省けるはずです。詳細は、FindBugs のウェブサイト(https://findbugs.sourceforge.net)をご覧ください。
コメント