第8章 フィルタ ファイル

目次

1. フィルタファイルについて
2. Match 部分の種類
3. Caveats
4. 例
5. 完全な例

特定のクラスやメソッドをバグレポートに含めるか除外するかということの ためにフィルタファイルを使うことができます。 この章ではフィルタファイルの 使用法について説明します。

[Note]計画されている機能

現在フィルタはコマンドラインインターフェースによってのみサポートされています。 最終的には、フィルタのサポートは GUI にも追加される予定です。

1. フィルタファイルについて

概念としては、フィルタは一組の基準に対するバグの例が合致します。 フィルタを定義することで、バグの例を特別に選択することができます。 例えば、報告にそれらを含めるか除外するかといったことに用います。

フィルタファイルは、トップレベルが FindBugsFilter 要素で、子要素として数個の Match を持つ XML 文書です。 個々の Match 要素は 生成されるバグ例に適用される述語の表現です。 通常、フィルタはバグ例を除外するのに使われます。 例えば:

$ findbugs -textui -exclude myExcludeFilter.xml myApp.jar

しかしながら、フィルタは限定的にバグ報告を選択するためにもまた用いることができます:

$ findbugs -textui -include myIncludeFilter.xml myApp.jar

Match 要素は、適用したいクラスあるいはクラス群を class または classregex 属性で指定します。 class 属性は、クラスの名前を指定します。 classregex 属性はバグ例のクラス名に適用される 正規表現を指定します。 正規表現は、マッチングのために java.util.regex.Pattern オブジェクトが作成され使用されます。 Match 要素は、順次適用される述部の子要素を含んでいます。 言い換えると、述部が真になるために、個々の子要素は真になる必要があります。

2. Match 部分の種類

<BugCode>

この要素は、バグの略語を指定します。 name 属性は、コンマ区切りの略語リストです。

<BugPattern>

この要素は、特定のバグパターンあるいは合致させるバグパターンを指定します。 name 属性は、バグパターン種別のコンマ区切りのリスト です。 特別な警告のために -xml 出力オプション (BugInstancetype 属性) によって 生成される出力を見るか、 bug descriptions document よりバグパターン種別を探すことが できます。

<Priority>

この要素は、特定の優先度を持つ警告と合致させます。 value 属性は ひとつの整数値である必要があります: 1: 高いプライオリティの警告と合致、2: 普通のプライオリティの 警告と合致、3: 低いプライオリティの警告と合致

<Method>

この要素はメソッドを指定します。 name 属性は メソッドの名前です。 params 属性は、メソッド パラメータの種類の コンマ区切りのリストです。 returns 属性は メソッドの戻り値の種類です。 params および returns では、クラス名は完全修飾である必要があります。 (例えば、"String" とするのでなく、"java.lang.String") メモ、params および returns は、オプションです。 name のみの指定とすることもできます、その場合、その名前に対する すべてのメソッドが合致することになります。 しかし、params あるいは returns のどちらかでも指定する場合は、それら両方を指定する必要があります。

<Or>

この要素は、disjuncts として Match 要素と組み合わされます。 例えば、Or に、2つの Method 要素を 置くことでどちらかのメソッドとの一致を指示できます。

3. Caveats

Match にて、実際に含まれているバグ例を含んだ情報のみに 一致させることができます。 すべてのバグ例はクラスを持ち、一般的に クラスによるバグの除外が役に立ちます。

いくつかのバグ例は2つ(あるいはそれ以上)のクラスを持ちます。 例えば、DE (dropped exception) バグは、 dropped exception が起こるメソッドが含まれているクラスと dropped exception の種類を 象徴するクラスの両方が報告されます。 first (primary) クラスのみが、Match 部分に対して 合致します。 例えば、"com.foobar.A" および "com.foobar.B" クラスに対する IC (initialization circularity) の報告を抑制したい場合、2 つの Match 記述を 使います:

   <Match class="com.foobar.A">
      <BugCode name="IC" />
   </Match>

   <Match class="com.foobar.B">
      <BugCode name="IC" />
   </Match>

明示的に両方のクラスと一致させることによって、循環的に含まれるどのクラスが バグ例に最初にリストされるかにかかわらず、IC バグ例が一致することを 保障することができます。(もちろん、この手法は偶然 "com.foobar.A" あるいは "com.foobar.B" と、第3のクラス を含むものをも抑制するかもしれません。)

多くの種類のバグは、それらが発生するメソッドを報告します。 それらのバグの例では、 Match 要素に Method を入れることができ、 また、それらが動くべき期待した動作を追加できます。

4. 例

1. クラスからすべてのバグ報告

     <Match class="com.foobar.MyClass" />

2. 略語によって指定されたそれらのクラスから確かなテストと合致したもの

     <Match class="com.foobar.MyClass">
       <BugCode name="DE,UrF,SIC" />
     </Match>

3. 略語によって指定されたそれらのすべてのクラスから確かなテストと合致したもの

     <Match classregex=".*" >
       <BugCode name="DE,UrF,SIC" />
     </Match>

4. 略語によって指定されたそれらのクラスの指定したメソッドからバグの種類と合致したもの

     <Match class="com.foobar.MyClass">
       <Or>
         <Method name="frob" params="int,java.lang.String" returns="void" />
         <Method name="blat" params="" returns="boolean" />
       </Or>
       <BugCode name="DC" />
     </Match>

5. 特定のメソッド内で特定のバグパターンと合致したもの

      
    <!-- A method with an open stream false positive. -->
    <Match class="com.foobar.MyClass">
      <Method name="writeDataToFile"/>
      <BugPattern name="OS_OPEN_STREAM"/>
    </Match>

    

6. 特定のメソッド内で与えられた優先度で特定のバグパターンと合致したもの

      
    <!-- A method with a dead local store false positive (medium priority). -->
    <Match class="com.foobar.MyClass">
      <Method name="someMethod"/>
      <BugPattern name="DLS_DEAD_LOCAL_STORE"/>
      <Priority value="2"/>
    </Match>

    

5. 完全な例


<FindBugsFilter>
     <Match class="com.foobar.ClassNotToBeAnalyzed" />

     <Match class="com.foobar.ClassWithSomeBugsMatched">
       <BugCode name="DE,UrF,SIC" />
     </Match>

     <!-- Match all XYZ violations. -->
     <Match classregex=".*" >
       <BugCode name="XYZ" />
     </Match>

     <!-- Match all doublecheck violations in these methods of "AnotherClass". -->
     <Match class="com.foobar.AnotherClass">
       <Or>
         <Method name="nonOverloadedMethod" />
         <Method name="frob" params="int,java.lang.String" returns="void" />
         <Method name="blat" params="" returns="boolean" />
       </Or>
       <BugCode name="DC" />
     </Match>


    <!-- A method with a dead local store false positive (medium priority). -->
    <Match class="com.foobar.MyClass">
	  <Method name="someMethod"/>
	  <BugPattern name="DLS_DEAD_LOCAL_STORE"/>
	  <Priority value="2"/>
	</Match>

</FindBugsFilter>