FindBugsの紹介

1概要

FindBugsは、Javaコード上で 静的解析 を実行するためのオープンソースツールです。

この記事では、JavaプロジェクトでFindBugsを設定し、それをIDEとMavenビルドに統合する方法を見ていきます。

2 FindBugs Mavenプラグイン

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>

https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.codehaus.mojo%22%20AND%20a%3A%22findbugs-maven-plugin%22 をチェックアウトすることができます。 Maven Centralのプラグインの最新バージョン]。

2.2. レポート作成

Mavenプラグインが正しく設定されたので、 mvn site コマンドを使用してプロジェクトのドキュメントを生成しましょう。

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

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

FindBugsプラグインは状況によっては失敗するように設定することもできます - 実行目標 check を設定に追加することで:

<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 FindBugs Eclipseプラグイン

3.1. インストール

FindBugsプラグインのIDEインストールは非常に簡単です - Eclipse __、 __のソフトウェア更新機能を使用する必要があるのは次の更新サイトです。

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

3.2. レポート閲覧

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

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

/uploads/bug__explorer.png%20652w +バージョン2以降、FindBugsは1から20までのスケールでバグのランク付けを開始し、不具合の重大度を測定しました。

  • 怖い :1と4の間にランク付けされる。

  • 怖い :5の間にランクイン

  • 問題 :10位にランクイン

  • 気になる :15の間にランクイン

バグランクは重大度を表しますが、信頼係数はこれらのバグが本物のものとしてフラグを立てられる可能性を反映しています。 自信はもともと優先 と呼ばれていましたが、新しいバージョンでは名前が変更されました。

もちろん、欠陥の中には解釈に影響されやすいものもあり、ソフトウェアの望ましい動作に害を及ぼすことなく存在するものもあります。

そのため、現実の状況では、特定のプロジェクトでアクティブにするための限られた一連の欠陥を選択して、静的分析ツールを適切に構成する必要があります。

3.3. Eclipseの設定

FindBugsプラグインは、警告をフィルタリングし結果の厳しさを制限するためのさまざまな方法を提供することによって、バグ分析戦略のカスタマイズを容易にします。あなたはウィンドウ - >設定 - > Java - > FindBugsに行くことによって設定インターフェースをチェックすることができます:

リンク:/uploads/fb__preferences-1.png%20668w[]

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

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

  • 正当性 - 一般的なバグを収集します。無限ループ

equals() などの不適切な使用 悪い習慣** 、例えば例外処理、開かれたストリーム、文字列

比較など パフォーマンス** 、アイドルオブジェクト

  • マルチスレッドの正確性 - 同期の矛盾を収集します

マルチスレッド環境におけるさまざまな問題 国際化** - エンコーディングに関する問題を収集し、

アプリケーションの国際化 悪意のあるコードの脆弱性** - コード内の脆弱性を収集します。

潜在的な攻撃者によって悪用される可能性のあるコードスニペット セキュリティ** - 特定のプロトコルに関するセキュリティホールを収集します。

SQLインジェクション Dodgy ** - コードの匂いを集める。無駄な比較、nullチェック、

未使用の変数など

[Detectorの設定]タブで、プロジェクトで尊重することになっているルールを確認できます。

リンク:/uploads/fb preferences detector-1.png%20729w[]

  • speed属性は、分析がどれだけ高価になるかを反映しています** 。検出器が最速であるほど、それを実行するために消費されるリソースは最小になります。

FindBugsによって認識されているバグの完全なリストは、 公式のドキュメントページ で見つけることができます。

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

4 FindBugs IntelliJ IDEAプラグイン

4.1. インストール

あなたがIntelliJ IDEAのファンで、FindBugsを使ってJavaコードの検査を始めたいのなら、https://plugins.jetbrains.com/plugin/3847?pr =idea[official JetBrains siteからプラグインインストールパッケージを入手するだけです。]をクリックし、フォルダ%INSTALLATION__DIRECTORY%/pluginsに解凍します。 IDEを再起動してください。

あるいは、「設定」 - >「プラグイン」にナビゲートして、すべてのリポジトリーでFindBugsプラグインを検索します。

この記事を書いている時点で、IntelliJ IDEAプラグインのバージョン1.0.1が出ました

FindBugsプラグインが正しくインストールされていることを確認するには、[Analyze] - >[FindBugs]の下の[Analyze project code]というラベルの付いたオプションを確認してください。

4.2. レポート閲覧

IDEAで静的解析を起動するには、Analyze - > FindBugsの下の“ Analyze project code”をクリックし、FindBugs-IDEAパネルで結果を調べます。

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

  1. バグカテゴリでグループ化します.

  2. クラスでグループ化する

  3. パッケージでグループ化します.

  4. バグランクでグループ化します.

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

4.3. 構成

IDEA内のFindBugsプラグイン設定ページは、一目瞭然です。

リンク:/uploads/IntelliJ-Preferences-1-1.png%20506w[]

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

Preferencesパネルは、FindBugs-IDEAパネルの下にある「Plugin preferences」アイコンをクリックすることで、IDEA内にアクセスできます。

5スプリングレストプロジェクトのレポート分析

このセクションでは、例としてhttps://github.com/eugenp/tutorials/tree/master/spring-rest[spring-rest]プロジェクトで行われた静的解析に焦点を当てます。

リンク:/uploads/Spring-rest-analysis-2.png%20489w[]

欠陥の大部分は軽微なものです - 心配ですが、それらのいくつかを修正するために私たちが何ができるかを見てみましょう。

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

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

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

  • このメソッドは例外でストリームを閉じることができないかもしれません:** この特別な欠陥は例外処理の典型的なユースケースを示しています。

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() 命令の前に例外がスローされると、ストリームは閉じられません。そのため、 try / catch ルーチン中に開かれたストリームを閉じるために finally \ {} ブロックを使用することが常に望ましい理由です。

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

  • フィールドはコンストラクタ内で初期化されず、nullチェックなしで間接参照されます** :それ以外の場合は、コードが NPE . したがって、変数が正しく初期化されているかどうかわからないときはいつでもNULLチェックを実行することをお勧めします。

6. 結論

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

ご覧のとおり、FindBugsは強力かつシンプルな静的分析ツールであり、システムの潜在的な品質ホールを検出するのに役立ちます。

最後に、FindBugsは Sputnik のような独立した連続的な自動コードレビューツールの一部として実行することもできます。これはレポートをもっと見やすくするのに非常に役立ちます。 。

静的解析に使用したサンプルコードはhttps://github.com/eugenp/tutorials/tree/master/spring-rest[Githubに追加]を利用できます。