SpotBugsプラグインの実装

Mavenプロジェクトの作成

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

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

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

In generated project, you can find a file named as BadCase.java. Update this file to represent the target bug to find.

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

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

In generated project, you can find another file named as MyDetectorTest.java. The spotbugs.performAnalysis(Path) in this test runs SpotBugs with your plugin, and return all found bugs (here 1st argument of this method is a path of class file compiled from BadCase.java).

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

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

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

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

Update GoodCase.java in your project, and represent such cases. After that, add a test method into MyDetectorTest.java which verify that no bug found from this GoodCase class.

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

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

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

注釈

TBU

選ぶべきスーパークラス

AnnotationDetector

クラス、フィールド、メソッド、メソッドパラメータに関するアノテーションを解析するベースディテクタです。

BytecodeScanningDetector

クラスファイル内のJavaバイトコードを解析するベースディテクタです。

OpcodeStackDetector

Sub class of BytecodeScanningDetector, which can scan the bytecode of a method and use an 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>