1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>第8章 フィルターファイル</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1"><link rel="home" href="index.html" title="FindBugs™ マニュアル"><link rel="up" href="index.html" title="FindBugs™ マニュアル"><link rel="prev" href="eclipse.html" title="第7章 FindBugs™ Eclipse プラグインの使用方法"><link rel="next" href="analysisprops.html" title="第9章 分析プロパティー"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">第8章 フィルターファイル</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="eclipse.html">戻る</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="analysisprops.html">次へ</a></td></tr></table><hr></div><div class="chapter" title="第8章 フィルターファイル"><div class="titlepage"><div><div><h2 class="title"><a name="filter"></a>第8章 フィルターファイル</h2></div></div></div><div class="toc"><p><b>目次</b></p><dl><dt><span class="sect1"><a href="filter.html#d0e1709">1. フィルターファイルの概要</a></span></dt><dt><span class="sect1"><a href="filter.html#d0e1759">2. マッチング条件の種類</a></span></dt><dt><span class="sect1"><a href="filter.html#d0e1958">3. Java 要素名マッチング</a></span></dt><dt><span class="sect1"><a href="filter.html#d0e1982">4. 留意事項</a></span></dt><dt><span class="sect1"><a href="filter.html#d0e2012">5. 例</a></span></dt><dt><span class="sect1"><a href="filter.html#d0e2065">6. 完全な例</a></span></dt></dl></div><p>フィルターファイルを使用することで、特定のクラスやメソッドをバグ報告に含めたりバグ報告から除外したりすることができます。この章では、フィルターファイルの使用方法を説明します。</p><div class="note" title="計画されている機能" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note: 計画されている機能"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[注記]" src="note.png"></td><th align="left">計画されている機能</th></tr><tr><td align="left" valign="top"><p>フィルターは現在、コマンドラインインタフェースでのみサポートされています。最終的には、フィルターのサポートは GUI にも追加される予定です。</p></td></tr></table></div><p>
</p><div class="sect1" title="1. フィルターファイルの概要"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1709"></a>1. フィルターファイルの概要</h2></div></div></div><p>概念的に言えば、フィルターはバグ検索結果をある基準と照合します。フィルターを定義することで、 特別な取り扱いをするバグ検索結果を選択することができます。例えば、あるバグ検索結果をバグ報告に含めたり、バグ報告から除外したりすることができます。</p><p>フィルターファイルは、 <a class="ulink" href="http://www.w3.org/XML/" target="_top">XML</a> 文書です。最上位要素が <code class="literal">FindBugsFilter</code> 要素 であり、その子要素として <code class="literal">Match</code> 要素を複数個定義します。それぞれの <code class="literal">Match</code> 要素は、生成されたバグ検索結果に適用される述部にあたります。通常、フィルターはバグ検索結果を除外するために使用します。次に、例を示します:</p><pre class="screen">
<code class="prompt">$ </code><span class="command"><strong>findbugs -textui -exclude <em class="replaceable"><code>myExcludeFilter.xml</code></em> <em class="replaceable"><code>myApp.jar</code></em></strong></span>
</pre><p>また一方で、的をしぼった報告を得るためにバグ報告結果を選択するためにフィルターを使用することも考えられます :</p><pre class="screen">
<code class="prompt">$ </code><span class="command"><strong>findbugs -textui -include <em class="replaceable"><code>myIncludeFilter.xml</code></em> <em class="replaceable"><code>myApp.jar</code></em></strong></span>
</pre><p>
</p><p>
<code class="literal">Match</code> 要素は子要素を持ちます。それらの子要素は論理積で述部になります。つまり、述部が真であるためには、すべての子要素が真である必要があります。</p></div><div class="sect1" title="2. マッチング条件の種類"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1759"></a>2. マッチング条件の種類</h2></div></div></div><div class="variablelist"><dl><dt><span class="term"><code class="literal"><Bug></code></span></dt><dd><p>この要素は、バグパターンを指定して照合します。<code class="literal">pattern</code> 属性には、コンマ区切りでバグパターン類型のリストを指定します。どの警告がどのバグパターン類型にあたるかは、 <span class="command"><strong>-xml</strong></span> オプションをつかって出力されたもの (<code class="literal">BugInstance</code> 要素の <code class="literal">type</code> 属性) を見るか、または、 <a class="ulink" href="../../bugDescriptions.html" target="_top">バグ解説ドキュメント</a>を参照してください。</p><p>もっと粒度の粗い照合を行いたいときは、 <code class="literal">code</code> 属性を使用してください。バグ略称のコンマ区切りのリストで指定できます。さらに粒度の粗い照合を行いたいときは、 <code class="literal">category</code> 属性を使用してください。次に示す、バグカテゴリー名のコンマ区切りのリストで指定できます : <code class="literal">CORRECTNESS</code>, <code class="literal">MT_CORRECTNESS</code>, <code class="literal">BAD_PRACTICICE</code>, <code class="literal">PERFORMANCE</code>, <code class="literal">STYLE</code>.</p><p>同じ <code class="literal"><Bug></code> 要素に上記の属性を複数指定した場合は、バグパターン名、バグ略称、バグカテゴリーのいずれか1つでも該当すれば、バグパターンは合致すると判定されます。</p><p>下位互換性を持たせたい場合は、 <code class="literal"><Bug></code> 要素の代わりに <code class="literal"><BugPattern></code> 要素および <code class="literal"><BugCode></code> 要素を使用してください。これらの要素はそれぞれ、 <code class="literal">name</code> 属性で値のリストを指定します。これらの要素は、将来サポートされなくなる可能性があります。</p></dd><dt><span class="term"><code class="literal"><Priority></code></span></dt><dd><p>この要素は、特定の優先度をもつ警告を照合します。<code class="literal">value</code> 属性には、整数値を指定します : 1 は優先度(高)、また、 2 は優先度(中) 、 3 は優先度(低) を示します。</p></dd><dt><span class="term"><code class="literal"><Package></code></span></dt><dd><p>この要素は、 <code class="literal">name</code> 属性で指定した特定のパッケージ内にあるクラスに関連した警告を照合します。入れ子のパッケージは含まれません (Java import 文に従っています) 。しかしながら、正規表現を使うと複数パッケージにマッチさせることは簡単にできます。</p></dd><dt><span class="term"><code class="literal"><Class></code></span></dt><dd><p>この要素は、特定のクラスに関連した警告を照合します。<code class="literal">name</code> 属性を使用して、照合するクラス名をクラス名そのものか、または、正規表現で指定します。</p><p>下位互換性を持たせたい場合は、この要素の代わりに <code class="literal">Match</code> 要素を使用してください。クラス名そのものの指定は <code class="literal">class</code> 属性を、クラス名を正規表現で指定する場合は <code class="literal">classregex</code> 属性をそれぞれ使用してください</p><p>もし <code class="literal">Match</code> 要素に <code class="literal">Class</code> 要素が無かったり、 <code class="literal">class</code> / <code class="literal">classregex</code> 属性が無かったりした場合は、すべてのクラスに適用されます。その場合、想定外に多くのバグ検索結果が一致してしまうことがあり得ます。その場合は、適当なメソッドやフィールドで絞り込んでください。</p></dd><dt><span class="term"><code class="literal"><Method></code></span></dt><dd><p>この要素は、メソッドを指定します。<code class="literal">name</code> 属性を使用して、照合するメソッド名をメソッド名そのものか、または、正規表現で指定します。<code class="literal">params</code> 属性には、コンマ区切りでメソッド引数の型のリストを指定します。<code class="literal">returns</code> 属性にはメソッドの戻り値の型を指定します。<code class="literal">params</code> および <code class="literal">returns</code> においては、クラス名は完全修飾名である必要があります。(例えば、単に "String" ではなく "java.lang.String" としてください。) <code class="literal">params</code> <code class="literal">returns</code> のどちらか一方を指定した場合は、もう一方の属性の指定も必須です。なぜならば、メソッドシグニチャーを構築のために必要だからです。<code class="literal">name</code> 属性、<code class="literal">params</code> 属性 および <code class="literal">returns</code> 属性または 3 つの 属性すべて、のどれかを条件とすることできることを意味しています。このように、名前とシグニチャーに基づく様々な種類の条件を規定できます。</p></dd><dt><span class="term"><code class="literal"><Field></code></span></dt><dd><p>この要素は、フィールドを指定します。<code class="literal">name</code> 属性を使用して、照合するフィールド名をフィールド名そのものか、または、正規表現で指定します。また、フィールドのシグニチャーに照らしたフィルタリングをすることができます。 <code class="literal">type</code> 属性を使用して、フィールドの型を完全修飾名で指定してください。名前とシグニチャーに基づく条件を規定するために、その2つの属性を両方とも指定することができます。</p></dd><dt><span class="term"><code class="literal"><Local></code></span></dt><dd><p>この要素は、ローカル変数を指定します。<code class="literal">name</code> 属性を使用して、照合するローカル変数名をローカル変数名そのものか、または、正規表現で指定します。ローカル変数とは、メソッド内で定義した変数です。</p></dd><dt><span class="term"><code class="literal"><Or></code></span></dt><dd><p>この要素は、論理和として <code class="literal">Match</code> 条項を結合します。すなわち、2つの <code class="literal">Method</code> 要素を <code class="literal">Or</code> 条項に入れることで、どちらか一方のメソッドでマッチさせることができます。</p></dd></dl></div></div><div class="sect1" title="3. Java 要素名マッチング"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1958"></a>3. Java 要素名マッチング</h2></div></div></div><p><code class="literal">Class</code> 、 <code class="literal">Method</code> または <code class="literal">Field</code> の <code class="literal">name</code> 属性が文字 ~ で始まっている場合は、属性値の残りの部分を Java の正規表現として解釈します。そうして、当該 Java 要素の名前に対しての照合が行われます。</p><p>パターンの照合は要素の名前全体に対して行われることに注意してください。そのため、部分一致照合を行いたい場合はパターン文字列の前後に .* を付加して使用する必要があります。</p><p>パターンの構文規則に関しては、 <a class="ulink" href="http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/regex/Pattern.html" target="_top"><code class="literal">java.util.regex.Pattern</code></a> のドキュメントを参照してください。</p></div><div class="sect1" title="4. 留意事項"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e1982"></a>4. 留意事項</h2></div></div></div><p>
<code class="literal">Match</code> 条項は、バグ検索結果に実際に含まれている情報にのみ一致します。すべてのバグ検索結果はクラスを持っています。したがって、一般的に言って、バグを除外するためにはクラスを用いて行うとうまくいくことが多いです。</p><p>バグ検索結果の中には、2個以上のクラスを保持しているものもあります。例えば、 DE (dropped exception : 例外の無視) バグは、 例外の無視が発生したメソッドを持っているクラスと、 無視された例外の型を表すクラスの両方を含んだ形で報告されます。<code class="literal">Match</code> 条項とは、 <span class="emphasis"><em>1番目</em></span> (主) のクラスのみが照合されます。したがって、例えば、クラス "com.foobar.A" 、 "com.foobar.B" 間での IC (initialization circularity : 初期化時の処理循環) バグ報告を抑止したい場合、以下に示すように 2つの <code class="literal">Match</code> 条項を使用します :</p><pre class="programlisting">
<Match>
<Class name="com.foobar.A" />
<Bug code="IC" />
</Match>
<Match>
<Class name="com.foobar.B" />
<Bug code="IC" />
</Match>
</pre><p>明示的に両方のクラスで照合することによって、循環しているどちらのクラスがバグ検索結果の 1 番目になっているかに関係なく一致させることができます。(もちろんこの方法は、処理循環が "com.foobar.A" 、 "com.foobar.B" に加えて3番目のクラスも含んでいる場合は図らずも失敗してしまう恐れがあります。)</p><p>多くの種類のバグ報告は、自身が出現したメソッドを報告します。それらのバグ検索結果に対しては、 <code class="literal">Method</code> 条項を <code class="literal">Match</code> 要素に加えると期待通りの動作をするでしょう。</p></div><div class="sect1" title="5. 例"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2012"></a>5. 例</h2></div></div></div><p>1. 特定のクラスに対するすべてのバグ報告に一致させます。</p><pre class="programlisting">
<Match>
<Class name="com.foobar.MyClass" />
</Match>
</pre><p>
</p><p>2. バグ略称を指定して、特定のクラスに対する特定の検査項目に一致させます。</p><pre class="programlisting">
<Match>
<Class name="com.foobar.MyClass"/ >
<Bug code="DE,UrF,SIC" />
</Match>
</pre><p>
</p><p>3. バグ略称を指定して、すべてのクラスに対する特定の検査項目に一致させます。</p><pre class="programlisting">
<Match>
<Bug code="DE,UrF,SIC" />
</Match>
</pre><p>
</p><p>4. バグカテゴリーを指定して、すべてのクラスに対する特定の検査項目に一致させます。</p><pre class="programlisting">
<Match>
<Bug category="PERFORMANCE" />
</Match>
</pre><p>
</p><p>5. バグ略称を指定して、特定のクラスの指定されたメソッドに対する特定のバグ種別に一致させます。</p><pre class="programlisting">
<Match>
<Class name="com.foobar.MyClass" />
<Or>
<Method name="frob" params="int,java.lang.String" returns="void" />
<Method name="blat" params="" returns="boolean" />
</Or>
<Bug code="DC" />
</Match>
</pre><p>
</p><p>6. 特定のメソッドに対する特定のバグパターンに一致させます。</p><pre class="programlisting">
<!-- open stream に関する誤検出があるメソッド。-->
<Match>
<Class name="com.foobar.MyClass" />
<Method name="writeDataToFile" />
<Bug pattern="OS_OPEN_STREAM" />
</Match>
</pre><p>
</p><p>7. 特定のメソッドに対する特定の優先度を付与された特定のバグパターンに一致させます。</p><pre class="programlisting">
<!-- dead local store (優先度 (中)) に関する誤検出があるメソッド。-->
<Match>
<Class name="com.foobar.MyClass" />
<Method name="someMethod" />
<Bug pattern="DLS_DEAD_LOCAL_STORE" />
<Priority value="2" />
</Match>
</pre><p>
</p><p>8. AspectJ コンパイラーによって引き起こされるマイナーバグに一致させます (AspectJ の開発者でもない限り、それらのバグに関心を持つことはないと考えます)。</p><pre class="programlisting">
<Match>
<Class name="~.*\$AjcClosure\d+" />
<Bug pattern="DLS_DEAD_LOCAL_STORE" />
<Method name="run" />
</Match>
<Match>
<Bug pattern="UUF_UNUSED_FIELD" />
<Field name="~ajc\$.*" />
</Match>
</pre><p>
</p><p>9. 基盤コードの特定の部分に対するバグに一致させます</p><pre class="programlisting">
<!-- すべてのパッケージにある Messages クラスに対する unused fields 警告に一致。 -->
<Match>
<Class name="~.*\.Messages" />
<Bug code="UUF" />
</Match>
<!-- すべての internal パッケージ内の mutable statics 警告に一致。 -->
<Match>
<Package name="~.*\.internal" />
<Bug code="MS" />
</Match>
<!-- ui パッケージ階層内の anonymoous inner classes 警告に一致。 -->
<Match>
<Package name="~com\.foobar\.fooproject\.ui.*" />
<Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON" />
</Match>
</pre><p>
</p><p>10. 特定のシグニチャーを持つフィールドまたはメソッドのバグに一致させます。</p><pre class="programlisting">
<!-- すべてのクラスの main(String[]) メソッドに対する System.exit(...) usage 警告に一致。 -->
<Match>
<Method returns="void" name="main" params="java.lang.String[]" />
<Method pattern="DM_EXIT" />
</Match>
<!-- すべてのクラスの com.foobar.DebugInfo 型のフィールドに対する UuF 警告に一致。 -->
<Match>
<Field type="com.foobar.DebugInfo" />
<Bug code="UuF" />
</Match>
</pre><p>
</p></div><div class="sect1" title="6. 完全な例"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="d0e2065"></a>6. 完全な例</h2></div></div></div><pre class="programlisting">
<FindBugsFilter>
<Match>
<Class name="com.foobar.ClassNotToBeAnalyzed" />
</Match>
<Match>
<Class name="com.foobar.ClassWithSomeBugsMatched" />
<Bug code="DE,UrF,SIC" />
</Match>
<!-- XYZ 違反に一致。-->
<Match>
<Bug code="XYZ" />
</Match>
<!-- "AnotherClass" の特定のメソッドの doublecheck 違反に一致。-->
<Match>
<Class name="com.foobar.AnotherClass" />
<Or>
<Method name="nonOverloadedMethod" />
<Method name="frob" params="int,java.lang.String" returns="void" />
<Method name="blat" params="" returns="boolean" />
</Or>
<Bug code="DC" />
</Match>
<!-- dead local store (優先度 (中)) に関する誤検出があるメソッド。-->
<Match>
<Class name="com.foobar.MyClass" />
<Method name="someMethod" />
<Bug pattern="DLS_DEAD_LOCAL_STORE" />
<Priority value="2" />
</Match>
</FindBugsFilter>
</pre></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="eclipse.html">戻る</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="analysisprops.html">次へ</a></td></tr><tr><td width="40%" align="left" valign="top">第7章 <span class="application">FindBugs</span>™ Eclipse プラグインの使用方法 </td><td width="20%" align="center"><a accesskey="h" href="index.html">ホーム</a></td><td width="40%" align="right" valign="top"> 第9章 分析プロパティー</td></tr></table></div></body></html>
|