1. 概要

FindBugsは、Javaコードで静的分析を実行するために使用されるオープンソースツールです。

この記事では、JavaプロジェクトでFindBugsをセットアップし、それをIDEとMavenビルドに統合する方法について説明します。

2. FindBugsMavenプラグイン

2.1. Maven構成

静的分析レポートの生成を開始するには、最初にpom.xmlにFindBugsプラグインを追加する必要があります。

<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>3.0.4</version>
        </plugin>
    </plugins>
</reporting>

MavenCentralでプラグインの最新バージョンをチェックアウトできます。

2.2. レポートの生成

Mavenプラグインが適切に構成されたので、 mvnsiteコマンドを使用してプロジェクトドキュメントを生成しましょう。

レポートは、プロジェクトディレクトリの target /siteフォルダにfindbugs.htmlという名前で生成されます。

mvn findbugs:gui コマンドを実行してGUIインターフェースを起動し、現在のプロジェクトに対して生成されたレポートを参照することもできます。

FindBugsプラグインは、実行目標チェックを構成に追加することにより、特定の状況で失敗するように構成することもできます。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <version>3.0.4</version>
    <configuration>
        <effort>Max</effort>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>

effort –最大限に活用すると、より完全で正確な分析を実行し、コード内のより多くのバグを明らかにしますが、より多くのリソースを消費し、完了するまでに時間がかかります。

これで、コマンド mvn verify を実行して、分析の実行中に検出された欠陥に応じて、ビルドが成功するかどうかを確認できます。

プラグイン宣言にいくつかの基本的な構成を追加することで、レポート生成プロセスを強化し、分析をより細かく制御することもできます。

<configuration>
    <onlyAnalyze>org.baeldung.web.controller.*</onlyAnalyze>
    <omitVisitors>FindNullDeref</omitVisitors>
    <visitors>FindReturnRef</visitors>
</configuration>

onlyAnalyze オプションは、分析に適格なクラス/パッケージのコンマ区切り値を宣言します。

visitors / omitVisitors オプションもコンマ区切りの値であり、分析中に実行する/実行しない検出器を指定するために使用されます–visitorsおよびomitVisitorsは実行できないことに注意してください同時に使用する

検出器は、パッケージの修飾なしで、そのクラス名で指定されます。 このリンクをたどって、利用可能なすべての検出器クラス名の詳細を見つけてください。

3. FindBugsEclipseプラグイン

3.1. インストール

FindBugsプラグインのIDEインストールは非常に簡単です。Eclipseのソフトウェア更新機能を次の更新サイトで使用する必要があります: http://findbugs.cs.umd.edu/日食

FindBugsがEclipse環境に正しくインストールされていることを確認するには、Windows->Preferences->JavaでFindBugsというラベルの付いたオプションを探します。

3.2. レポートの閲覧

FindBugs Eclipseプラグインを使用してプロジェクトの静的分析を開始するには、パッケージエクスプローラーでプロジェクトを右クリックし、バグの検索というラベルの付いたオプションをクリックする必要があります。

起動後、Eclipseは、以下のスクリーンショットに示すように、BugExplorerウィンドウの下に結果を表示します。

バージョン2の時点で、FindBugsは、欠陥の重大度を測定するために1から20までのスケールでバグのランク付けを開始しました。

  • 最も怖い :1から4の間にランク付けされます。
  • 怖い :5から9の間にランク付けされました。
  • 困った :10から14の間にランク付けされました。
  • 気がかりな :15から20の間にランク付けされました。

バグランクは重大度を表しますが、信頼係数は、これらのバグが実際のバグとしてフラグ付けされる可能性を反映しています。 信頼度は元々priorityと呼ばれていましたが、新しいバージョンで名前が変更されました。

もちろん、一部の欠陥は解釈の余地があり、ソフトウェアの望ましい動作に害を及ぼすことなく存在することもあります。 そのため、実際の状況では、特定のプロジェクトでアクティブ化する欠陥の限られたセットを選択して、静的分析ツールを適切に構成する必要があります。

3.3. Eclipse構成

FindBugsプラグインを使用すると、警告をフィルタリングして結果の厳密さを制限するさまざまな方法を提供することで、バグ分析戦略を簡単にカスタマイズできます。 構成インターフェースを確認するには、「ウィンドウ」->「設定」->「Java」->「FindBugs」に移動します。

 

不要なカテゴリのチェックを自由に解除し、報告する最小ランクを上げ、報告する最小信頼度を指定し、バグランク(警告、情報、またはエラー)のマーカーをカスタマイズできます。

FindBugsは欠陥を多くのカテゴリに分類します。

  • 正しさ–一般的なバグを収集します。 無限ループ、 equals()の不適切な使用など
  • 悪い習慣、例: 例外処理、開いたストリーム、文字列の比較など
  • パフォーマンス、例: アイドル状態のオブジェクト
  • マルチスレッドの正確性–マルチスレッド環境での同期の不整合やさまざまな問題を収集します
  • 国際化–エンコーディングとアプリケーションの国際化に関連する問題を収集します
  • 悪意のあるコードの脆弱性–コードの脆弱性を収集します。 潜在的な攻撃者によって悪用される可能性のあるコードスニペット
  • セキュリティ–特定のプロトコルまたはSQLインジェクションに関連するセキュリティホールを収集します
  • 危険なコードの臭いを収集します。 役に立たない比較、nullチェック、未使用の変数など

検出器の構成タブで、プロジェクトで尊重することになっているルールを確認できます。

速度属性は、分析にかかるコストを反映します。 検出器が最速であるほど、それを実行するために消費されるリソースは最小です。

FindBugsによって認識されたバグの完全なリストは、公式ドキュメントページにあります。

フィルターファイルパネルで、コードベースの一部を含めたり除外したりするために、カスタムファイルフィルターを作成できます。 この機能は、たとえば、「管理されていない」または「ゴミ箱」のコード、レポートに表示される欠陥を防止したい場合、またはテストパッケージからすべてのクラスを除外したい場合などに役立ちます。

4. FindBugsIntelliJIDEAプラグイン

4.1. インストール

IntelliJ IDEAファンで、FindBugsを使用してJavaコードの検査を開始したい場合は、公式JetBrainsサイトからプラグインインストールパッケージを取得し、%INSTALLATION_DIRECTORY%/pluginsフォルダーに解凍するだけです。 。 IDEを再起動すれば、準備は完了です。

または、[設定]-> [プラグイン]に移動して、すべてのリポジトリでFindBugsプラグインを検索することもできます。

この記事を書いている時点で、IntelliJIDEAプラグインのバージョン1.0.1がリリースされました。

FindBugsプラグインが正しくインストールされていることを確認するには、[分析]->[FindBugs]の下にある[プロジェクトコードの分析]というラベルの付いたオプションを確認します。

4.2. レポートの閲覧

IDEAで静的分析を開始するには、[分析]-> [FindBugs]の下の[プロジェクトコードの分析]をクリックし、FindBugs-IDEAパネルを探して結果を確認します。

スクリーンショットの左側にあるコマンドの2番目の列を使用して、さまざまな要因を使用して欠陥をグループ化できます。

  1. バグカテゴリでグループ化します。
  2. クラスごとにグループ化します。
  3. パッケージごとにグループ化します。
  4. バグランクでグループ化します。

コマンドの4列目の「エクスポート」ボタンをクリックして、レポートをXML/HTML形式でエクスポートすることもできます。

4.3. 構成

IDEA内のFindBugsプラグイン設定ページはかなり自明です:

この設定ウィンドウは、Eclipseで見たものと非常によく似ているため、分析作業レベル、バグのランク付け、信頼性、クラスのフィルタリングなどから始めて、同様の方法であらゆる種類の構成を実行できます。

設定パネルには、FindBugs-IDEAパネルの下にある「プラグイン設定」アイコンをクリックして、IDEA内からアクセスできます。

5. Spring-Restプロジェクトのレポート分析

このセクションでは、例としてGithubで利用可能なspring-restプロジェクトで行われた静的分析に光を当てます。

欠陥のほとんどは軽微です—懸念事項ですが、それらのいくつかを修正するために何ができるか見てみましょう。

メソッドは例外的な戻り値を無視します:

File fileServer = new File(fileName);
fileServer.createNewFile();

ご想像のとおり、FindBugsは、 createNewFile()メソッドの戻り値を破棄しているという事実について不平を言っています。 考えられる修正方法は、戻り値を新しく宣言された変数に格納してから、DEBUGログレベルを使用して意味のあるものをログに記録することです。 戻り値がtrueの場合、「指定されたファイルは存在せず、正常に作成されました」。

メソッドは例外でストリームを閉じることができない場合があります:この特定の欠陥は、常にfinallyブロックでストリームを閉じることを示唆する例外処理の典型的なユースケースを示しています

try {
    DateFormat dateFormat 
      = new SimpleDateFormat("yyyy_MM_dd_HH.mm.ss");
    String fileName = dateFormat.format(new Date());
    File fileServer = new File(fileName);
    fileServer.createNewFile();
    byte[] bytes = file.getBytes();
    BufferedOutputStream stream 
      = new BufferedOutputStream(new FileOutputStream(fileServer));
    stream.write(bytes);
    stream.close();
    return "You successfully uploaded " + username;
} catch (Exception e) {
    return "You failed to upload " + e.getMessage();
}

stream.close()命令の前に例外がスローされた場合、ストリームが閉じられることはありません。そのため、開いたストリームを閉じるには finally{}ブロックを使用することが常に推奨されます。 try / catchルーチン中。

例外がスローされないときに例外がキャッチされる:ご存知かもしれませんが、例外をキャッチすることは悪いコーディング慣行であり、FindBugsは最も具体的な例外をキャッチする必要があると考えています。適切に処理してください。 したがって、基本的にJavaクラスでストリームを操作し、 IOException をキャッチする方が、より一般的なExceptionをキャッチするよりも適切です。

フィールドはコンストラクターで初期化されていませんが、nullチェックなしで逆参照されています :コンストラクター内でフィールドを初期化することは常に良い考えです。そうしないと、コードが NPE。 したがって、変数が適切に初期化されているかどうかわからない場合は、nullチェックを実行することをお勧めします。

6. 結論

この記事では、JavaプロジェクトでFindBugsを使用およびカスタマイズするための基本的なキーポイントについて説明しました。

ご覧のとおり、FindBugsは強力でありながらシンプルな静的分析ツールであり、正しく調整および使用されている場合、システムの潜在的な品質の穴を検出するのに役立ちます。

最後に、FindBugsは、 Sputnik のような個別の継続的な自動コードレビューツールの一部として実行することもできます。これは、レポートの可視性を高めるのに非常に役立ちます。

静的分析に使用したサンプルコードは、Githubから入手できます。