プロジェクト

全般

プロフィール

NetBeans FindBugsプラグイン

FindBugsは、Javaのコード1を静的解析し、バグパターンに合致する箇所を検出するツールです。
NetBeansのプラグインとしてFindBugsを組み込むことで、NetBeans上で解析の実施と検出箇所を表示することができます。

1 FindBugsはソースコードではなくバイトコードを検査します。

インストール

  • [ツール]メニュー>[プラグイン]を選択し、「プラグイン」ダイアログを開きます。
  • [使用可能なプラグイン]タブを選択し、一覧から「FindBugs Integration」を選択し、インストール欄にチェックを付け、[インストール]ボタンを押します。

FindBugs-01.png

2017.6.25現在でインストールされるFindBugs Integrationプラグインの1.32は、FindBugs 3.0.0を同梱したプラグインです。

NetBeans 8.2でインストール時の問題

nb82_install_error-1.png

原因を調査し、次のブログに記載
https://torutk.hatenablog.jp/entry/2020/03/01/215934

設定

適用するルールを編集する方法を示します。

  • [ツール]メニュー>[オプション]で「オプション」ダイアログを開きます。
  • [エディタ]を選択し、[ヒント]タブを選択します。
  • 左上の言語欄で[FindBugs]を選択します。

FindBugsConfig-01.png

  • リストのルールを適宜On/Offします。
  • [Run FindBugs in Editor]にチェックを付けます。

[適用]ないし[OK]ボタンを押し、適用するルールの変更を反映すると、ルール設定が次のパスに生成されます。

USERPROFILE\AppData\Roaming\NetBeans\8.0rc1\config\Preferences\org\netbeans\modules\findbugs\global-settings.properties
BAC_BAD_APPLET_CONSTRUCTOR=true
BC_IMPOSSIBLE_CAST=true
BC_IMPOSSIBLE_CAST_PRIMITIVE_ARRAY=true
BC_IMPOSSIBLE_DOWNCAST=true
  :(中略)
VR_UNRESOLVABLE_REFERENCE=true
XSS_REQUEST_PARAMETER_TO_JSP_WRITER=false
XSS_REQUEST_PARAMETER_TO_SEND_ERROR=false
XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER=false

実行

FindBugsの検査を実行

FindBugsの検査を実行するには、

  • [ソース]メニュー > [検査]を選択し、「検査」ダイアログを表示します。
  • [スコープ]ドロップダウンリストを展開し、検査対象とするスコープを選択します(次の画面)。

inspect_scope-1.png

  • [構成]ドロップダウンリストを展開し、FindBugsを選択します(次の画面)。

inspect_config-1.png

  • [検査]ボタンを押し、検査を実行します。

実行結果(インスペクト画面)が表示され、検査結果が表示されます(次の画面)。

result-1.png

Java SE 8のコード(ラムダ式)を使っていますが、FindBugsの解析は通っています。

検出の抑制

FindBugsが検出した箇所が許容可能な場合、以降その箇所ではFindBugsの検出を抑制する手段が必要です。

アノテーション SuppressFBWarnings で検出を抑制

FindBugsの配布ライブラリ annotations.jar に含まれる SuppressFBWarnings アノテーションをクラスやメソッド、フィールドに指定します。

以下は、Serializableを実装したクラスでserialVersionUIDフィールドを定義しない場合に出るFindBugsの検出を抑制する例です。

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
  :
@SuppressFBWarnings(value={"SE_NO_SERIALVERSIONID"}, justification="OK by 1112")
public class HelloImpl implements Hello, Serializable {
  :
}

検出を抑制するFindBugsのルール名をvalue(配列)に指定します。抑制の理由をjustificationに記述します。例えばコードレビューで検出箇所の妥当性を認めた場合に、そのレビュー識別子(チケット番号)を記載する等です。

コンパイル時に、FindBugsのannotations.jarをクラスパスに指定する必要があります。
もし外部JARのクラスパスを持ちたくない場合は、ビルド単位の中に独自にアノテーションSuppressFBWarningsを定義して使用することもできます。アノテーション型名が一致していればパッケージ名は異なってもFindBugsは認識して検出を抑制します。

package com.torutk.checker;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * FindBugsの警告を抑制する箇所に指定するアノテーション。
 */
@Retention(RetentionPolicy.CLASS)
public @interface SuppressFBWarnings {
    String[] value() default {};
    String justification() default "SUPPRESS CHECK";
}

その他メモ

  • Java SE 8 b106ではFindBugs実行([ソース]メニュー>[検査])でエラーとなります。
    Java SE 8のクラスファイル仕様変更によるものらしいです。
    http://sourceforge.net/p/findbugs/bugs/1162/

SpotBugs

2015年のFindBugs 3.0.1リリース以降、2017年6月現在までFindBugsの更新が滞っています。ブログ等でその状況が説明されています。

FindBugs Integrationプラグイン 1.32 のFindbugs 3.0.0をSpotBugs 3.1.0 RC3に入れ替え

チケット #72 において、FindBugs 1.32 のライブラリを差し替えて、SpotBugs 3.10 RC3を使う調査と実験をしました。

以下は、Windows上にインストールされたNetBeans 8.2 のFindBugs Integrationプラグイン(1.32)の同梱FindBugs 3.0.0 を、SpotBugs 3.1.0 RC3に更新するパッチです(バッチコマンドでjarファイルを追加・差し替え)。

NetBeans FindBugs Integrationプラグインのソースコード

FindBugs Integrationは、NetBeans IDEのソースコードリポジトリ内に存在します。

例えば、FindBugs Integrationの依存ライブラリの定義は次となります。
https://github.com/apache/netbeans/blob/master/nbbuild/external/findbugs/build.xml

NetBeans FindBugs Integrationプラグインの非インターネット接続環境用修正

NetBeans 8.2のFindBugs Integrationプラグインインストールがエラーに
の対処(回避策2)を適用したNBMファイルを用意しました。

過去のメモ

Java SE 8とFindBugs

  • 2015-04時点
    Findbugs 3.0.1がリリースされています。
  • 2014-07-30時点の状況
    Java SE 8対応のFindBugs 3.0.0がリリースされています。
  • 2014-07-05時点の状況
    Java SE 8対応のFindBugs 3.0.0-rc2がリリースされています。NetBeans向けFindBugs Integrationプラグイン 1.27をFindBugs 3.0.0-rc2に差し替えるパッチを作成しました。
  • 2014-03-20時点の状況
    FindBugs Integrationのバージョン1.27は、Java SE 8のクラスファイル仕様に対応していないFindBugs 2.0.xを使用しています。Java SE 8への対応は次のメジャーリリースであるFindBugs 3.0の予定です。しかし、FindBugs 3.0はまだ開発途上で正式リリースされていません。
    なお、FindBugs 3.0スナップショット版が入手できるので、いったんFindBugs Integrationプラグインをインストールした後、FindBugs 3.0スナップショット版にファイルを差し替えることで完全ではない(invokedynamic未対応)ですがJava SE 8対応させることができます。
    差し替え版の作成手順は、チケット #8-3 を参照。

FindBugs IntegrationプラグインをJDK 8対応させるバッチ

3.0.0-SNAPSHOT版

FindBugs Integrationプラグインをインストールした後、FindBugsを2.0.3から3.0.0-SNAPSHOTに差し替える上述手順をバッチファイル化したものを作成しました。(バッチファイルなのでWindows用です)

NetBeansFindBugsIntegration_updater4jdk8-20140321.zip

一時作業ディレクトリを用意してそこにzipアーカイブを展開します。update.batを実行します(エクスプローラからダブルクリックでOK)。

2014-04-28コミット版

gitコミットハッシュ:1103397c8de2d0c0fcdf7ea5a7e15d86f002651e

FindBugs Integration プラグイン1.27版をインストールした後、FindBugsを2.0.3からtrunk最新版(2014-04-28)に差し替えるアップデータです(バッチファイルなのでWindows用です。Linux、MacOS Xは、バッチファイルを見ながら手作業で更新することで対応可能です)。

NetBeansFindBugsIntegration_updater4jdk8-20140601.zip

3.0.0-rc2版

FindBugs Integrationプラグインをインストールした後、FindBugsを2.0.3から3.0.0-rc2に差し替える上述手順をバッチファイル化したものを作成しました。(バッチファイルなのでWindows用ですLinux、MacOS Xは、バッチファイルを見ながら手作業で更新することで対応可能です)。

FindBugsIntegration_updater4jdk8_3.0.0rc2.zip

一時作業ディレクトリを用意してそこにzipアーカイブを展開します。update.batを実行します(エクスプローラからダブルクリックでOK)。


4年以上前に更新