SpotBugsプラグインの実装

Mavenプロジェクトの作成

spotbugs-archetype を使ってMavenプロジェクトを作成してください。Maven archetypeプラグインは、プラグインのgroupId、artifactId、package、initial versionを決定するように求めます。

$ mvn archetype:generate \
      -DarchetypeArtifactId=spotbugs-archetype \
      -DarchetypeGroupId=com.github.spotbugs \
      -DarchetypeVersion=0.2.4

見つけたいバグを表すコードを書く

生成されたプロジェクトでは BadCase.java という名前のファイルを見つけられます。見つけたい対象のバグを表すようにこのファイルを更新します。

表現するパターンが複数あるときは、src/test/java ディレクトリにクラスを追加してください。

ディテクタがバグを見つけられるようにテストケースを書く

生成されたプロジェクトでは MyDetectorTest.java という名前の別のファイルを見つけられます。このテストの spotbugs.performAnalysis(Path) はプラグインがあるSpotBugsを実行し、見つかったバグをすべて返します (このメソッドの第1引数は BadCase.java からコンパイルされたクラスファイルのパスです)。

BugInstanceMatcher でプラグインが期待したとおりにバグを見つけられることを確認します。

現在このテストは失敗するはずです。なぜなら、まだディテクタを更新していないからです。

誤検出を回避するためのコードを書く

誤検出を回避するために、どのようなときにディテクタがバグを見つけるべきでないかを確認することは良いことです。

プロジェクトの GoodCase.java を更新して、そのような例を表します。その後、MyDetectorTest.java にテストメソッドを追加して、この GoodCase クラスからバグが見つからないことを確認します。

表現するパターンが複数あるときは、src/test/java ディレクトリにクラスを追加してください。

すべての単体試験に合格するようにディテクタを更新する

これで、ディテクタが期待どおりに動作することを確認するテストが実施されました。

注釈

TBU

選ぶべきスーパークラス

AnnotationDetector
クラス、フィールド、メソッド、メソッドパラメータに関するアノテーションを解析するベースディテクタです。
BytecodeScanningDetector
クラスファイル内のJavaバイトコードを解析するベースディテクタです。
OpcodeStackDetector
BytecodeScanningDetector のサブクラスです。メソッドのバイトコードをスキャンし、operand stack を使用できます。

findbugs.xml の更新

SpotBugsは、それぞれのプラグインで findbugs.xml を読み出してディテクタとバグを見つけます。したがって、新しいディテクタを追加するときは、次のように新しい <Detector> 要素を追加する必要があります。

<Detector class="com.github.plugin.MyDetector" reports="MY_BUG" speed="fast" />

また、バグパターンのタイプとカテゴリを記述するために <BugPattern> を追加する必要があります。

<BugPattern type="MY_BUG" category="CORRECTNESS" />

生成されたMavenプロジェクトの src/main/resources ディレクトリに findbugs.xml があります。

messages.xml の更新

SpotBugsは、それぞれのプラグインで messages.xml を読み出し、検出されたバグを報告するための人間が読めるメッセージを作成します。また、messages_ja.xmlmessages_fr.xml などローカライズされたメッセージを読み出すこともサポートしています。

生成されたMavenプロジェクトの src/main/resources ディレクトリに messages.xml があります。

ディテクタのメッセージの更新

<Detector> 要素には、ディテクタを説明するメッセージを追加できます。メッセージはプレーンテキストでなければならず、HTMLはサポートされていないので注意してください。

<Detector class="com.github.plugin.MyDetector">
  <Details>
    Original detector to detect MY_BUG bug pattern.
  </Details>
</Detector>

バグパターンのメッセージの更新

<BugPattern> 要素には、バグパターンを説明するメッセージを追加できます。3 種類のメッセージがります。

ShortDescription
バグパターンの簡単な説明です。ユーザの意図やキャラクタを伝えるのに便利です。プレーンテキストでなければならず、HTMLはサポートされていません。
LongDescription

バグパターンのより長い説明です。{0} (0はインデックス)のようなプレースホルダを使うことができ、BugInstance がそこに挿入されます。この LongDescription は検出されたバグの詳細情報を伝えるのに便利です。

プレーンテキストでなければならず、HTMLはサポートされていません。

Details
バグパターンの詳細な説明です。HTML形式でなければなりません。詳細な仕様/例を表、リスト、コードスニペットで伝えるのに便利です。
<BugPattern type="MY_BUG">
  <ShortDescription>Explain bug pattern shortly.</ShortDescription>
  <LongDescription>
    Explain existing problem in code, and how developer should improve their implementation.
  </LongDescription>
  <Details>
    <![CDATA[
      <p>Explain existing problem in code, and how developer should improve their implementation.</p>
    ]]>
  </Details>
</BugPattern>