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.2
見つけたいバグを表すコードを書く¶
生成されたプロジェクトでは 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.xml
,messages_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>