FindBugsの概要
1. 概要
FindBugsは、Javaコードでstatic analysisを実行するために使用されるオープンソースツールです。
この記事では、JavaプロジェクトでFindBugsをセットアップし、それをIDEとMavenビルドに統合する方法について説明します。
2. FindBugsMavenプラグイン
2.1. Mavenの構成
静的分析レポートの生成を開始するには、最初にpom.xmlにFindBugsプラグインを追加する必要があります。
org.codehaus.mojo
findbugs-maven-plugin
3.0.4
Maven Centralでlatest version of the pluginを確認できます。
2.2. レポート生成
Mavenプラグインが適切に構成されたので、mvn siteコマンドを使用してプロジェクトドキュメントを生成しましょう。
レポートは、プロジェクトディレクトリのfindbugs.htmlという名前のフォルダtarget/siteに生成されます。
mvn findbugs:guiコマンドを実行してGUIインターフェイスを起動し、現在のプロジェクトに対して生成されたレポートを参照することもできます。
FindBugsプラグインは、実行目標checkを構成に追加することにより、特定の状況で失敗するように構成することもできます。
org.codehaus.mojo
findbugs-maven-plugin
3.0.4
Max
check
effort –上限に達すると、より完全で正確な分析が実行され、コード内のより多くのバグが明らかになりますが、より多くのリソースを消費し、完了するまでに時間がかかります。
これで、コマンドmvn verifyを実行して、分析の実行中に検出された欠陥に応じて、ビルドが成功するかどうかを確認できます。
プラグイン宣言にいくつかの基本構成を追加することにより、レポート生成プロセスを強化し、分析をより詳細に制御することもできます。
org.example.web.controller.*
FindNullDeref
FindReturnRef
onlyAnalyzeオプションは、分析に適格なクラス/パッケージのコンマ区切り値を宣言します。
visitors /omitVisitorsオプションもコンマ区切りの値であり、分析中に実行する/実行しない検出器を指定するために使用されます–visitors and omitVisitors cannot be used at the same timeに注意してください。
検出器はパッケージ名なしでクラス名で指定されます。 this linkに従って、使用可能なすべての検出器クラス名の詳細を検索します。
3. FindBugsEclipseプラグイン
3.1. インストール
FindBugsプラグインのIDEインストールは非常に簡単です。次の更新サイトでEclipse,のソフトウェア更新機能を使用する必要があります:http://findbugs.cs.umd.edu/eclipse.
FindBugsがEclipse環境に正しくインストールされていることを確認するには、Windows→Preferences→JavaでFindBugsというラベルの付いたオプションを探します。
3.2. レポートの閲覧
FindBugs Eclipseプラグインを使用してプロジェクトの静的分析を開始するには、パッケージエクスプローラーでプロジェクトを右クリックし、find bugsというラベルの付いたオプションをクリックする必要があります。
起動後、Eclipseは、下のスクリーンショットに示すように、Bug Explorerウィンドウに結果を表示します。
-
Scariest:1から4の間でランク付けされます。
-
Scary:5から9の間でランク付けされます。
-
Troubling:10から14の間でランク付けされます。
-
Of concern:15から20の間でランク付けされます。
バグランクは重大度を表しますが、信頼係数はこれらのバグが実際のバグとしてフラグを立てられる可能性を反映しています。 The confidence was originally called priorityですが、新しいバージョンで名前が変更されました。
もちろん、いくつかの欠陥は解釈の対象となる可能性があり、ソフトウェアの望ましい動作に害を及ぼさずに存在する可能性もあります。 そのため、実際の状況では、特定のプロジェクトでアクティブ化する欠陥の限定されたセットを選択して、静的分析ツールを適切に構成する必要があります。
3.3. Eclipse構成
FindBugsプラグインを使用すると、警告をフィルタリングして結果の厳密性を制限するさまざまな方法を提供することにより、バグ分析戦略を簡単にカスタマイズできます。 ウィンドウ→設定→Java→FindBugsに移動して、設定インターフェースを確認できます。
不要なカテゴリのチェックを自由に解除したり、報告する最小ランクを上げたり、報告する最小信頼度を指定したり、バグランク(警告、情報、エラー)のマーカーをカスタマイズしたりできます。
FindBugsは、欠陥を多くのカテゴリに分類します。
-
Correctness –一般的なバグを収集します。 無限ループ、equals()の不適切な使用など
-
Bad practice、例: 例外処理、開かれたストリーム、文字列比較など
-
Performance、例: アイドルオブジェクト
-
Multithreaded correctness –マルチスレッド環境での同期の不整合やさまざまな問題を収集します
-
Internationalization –エンコーディングとアプリケーションの国際化に関連する問題を収集します
-
Malicious code vulnerability –コードの脆弱性を収集します。 潜在的な攻撃者によって悪用される可能性のあるコードスニペット
-
Security –特定のプロトコルまたはSQLインジェクションに関連するセキュリティホールを収集します
-
Dodgy –コードの臭いを収集します。 役に立たない比較、nullチェック、未使用の変数など
[Detector configuration]タブで、プロジェクトで尊重することになっているルールを確認できます。
The speed attribute reflects how costly the analysis will be。 検出器が最速であるほど、それを実行するために消費されるリソースは最小になります。
FindBugsによって認識されたバグの完全なリストはofficial documentation pageにあります。
Filter filesパネルの下で、コードベースの一部を含めたり除外したりするために、カスタムファイルフィルターを作成できます。 この機能は、たとえば、「管理対象外」または「ゴミ箱」コード、レポートにポップアップする欠陥を防止したい場合、またはテストパッケージからすべてのクラスを除外したい場合などに便利です。インスタンス。
4. FindBugs IntelliJIDEAプラグイン
4.1. インストール
IntelliJ IDEAファンで、FindBugsを使用してJavaコードの検査を開始したい場合は、プラグインインストールパッケージをofficial JetBrains siteから取得し、フォルダー%INSTALLATION_DIRECTORY%/ pluginsに抽出するだけです。 IDEを再起動すれば、準備は完了です。
または、[設定]→[プラグイン]に移動して、すべてのリポジトリでFindBugsプラグインを検索することもできます。
この記事の執筆時点では、IntelliJ IDEAプラグインのバージョン1.0.1がリリースされていますが、
FindBugsプラグインが正しくインストールされていることを確認するには、[分析]→[FindBugs]で[プロジェクトコードの分析]というラベルの付いたオプションを確認します。
4.2. レポートの閲覧
IDEAで静的分析を開始するには、[分析]→[FindBugs]の下の[プロジェクトコードの分析]をクリックし、FindBugs-IDEAパネルを探して結果を確認します。
スクリーンショットの左側にあるコマンドの2列目を使用して、さまざまな要因を使用して欠陥をグループ化できます。
-
バグカテゴリ別にグループ化します。
-
クラスごとにグループ化します。
-
パッケージごとにグループ化します。
-
バグランクでグループ化します。
コマンドの4列目にある[エクスポート]ボタンをクリックして、レポートをXML / HTML形式でエクスポートすることもできます。
5. Spring-Restプロジェクトのレポート分析
このセクションでは、例としてspring-rest project available on Githubで実行された静的分析に光を当てます。
欠陥のほとんどは軽微です—懸念事項ですが、それらのいくつかを修正するために何ができるか見てみましょう。
メソッドは例外的な戻り値を無視します:
File fileServer = new File(fileName);
fileServer.createNewFile();
ご想像のとおり、FindBugsは、createNewFile()メソッドの戻り値を破棄しているという事実について不満を言っています。 考えられる修正方法は、返された値を新しく宣言された変数に格納し、DEBUGログレベルを使用して意味のある何かを記録することです。 戻り値がtrueの場合は「The named file does not exist and was successfully created」。
The method may fail to close stream on exception:この特定の欠陥は、always close streams in a finally blockに示唆する例外処理の典型的な使用例を示しています。
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 /%((t2)s /%()中に開かれたストリームを閉じるには、finally\{}ブロックを使用することが常に推奨されます。 t3)sルーチン。
An Exception is caught when Exception is not thrown:ご存知かもしれませんが、Exceptionをキャッチすることは悪いコーディング慣行です。FindBugsは、適切に処理できるように、最も具体的な例外をキャッチする必要があると考えています。 したがって、基本的にJavaクラスでストリームを操作する場合、より一般的なExceptionをキャッチするよりも、IOExceptionをキャッチする方が適切です。
Field not initialized in the constructor but dereferenced without null check:コンストラクター内のフィールドを初期化することは常に良い考えです。そうしないと、コードがNPE.を発生させる可能性があります。したがって、そうでない場合は常にnullチェックを実行することをお勧めします。変数が正しく初期化されているかどうかを確認してください。
6. 結論
この記事では、JavaプロジェクトでFindBugsを使用およびカスタマイズするための基本的なキーポイントについて説明しました。
ご覧のとおり、FindBugsは強力でありながらシンプルな静的分析ツールであり、システムの潜在的な品質ホールを検出するのに役立ちます。
最後に、FindBugsは、Sputnikのような個別の継続的な自動コードレビューツールの一部として実行することもできます。これは、レポートの可視性を高めるのに非常に役立ちます。
静的分析に使用したサンプルコードは、over on Githubで利用できます。