|
PMD vs FindBugshttp://works.dgic.co.jp/djwiki/Viewpage.do?pid=@504D442076732046696E6442756773Encoding:UTF-8 / Locale:en_US / PageStatus: Frozen Owner of this page:Guest |
PMD vs FindBugsオープン・ソースの静的解析ツール「PMD」と「FindBugs」の比較。 PMDPMD:http://pmd.sourceforge.net/ PMDとは、FindBugsと同様Javaのソースコードを解析して潜在的なバグを見つけるツールです。 PMDはJavaで書かれているため、実行にはJDK 1.3以上が必要です。 また、Antとの統合や主なIDEやプログラム・エデェイター用のプラグインも存在しています。 EclipseプラグインとしてPMDを導入する方法↓ http://pmd.sourceforge.net/eclipse/ 英語で書かれていますが、簡単に説明するとEclipseの「Find and Install」を使用して"http//pmd.sourceforge.net/eclipse"からダウンロードします。 「PMD」と「FindBugs」の比較 ΛEclipseプラグインとしての両ツールの比較です。 解析PMDはJavaのソースコードを解析するのに対し、FindBugsはコンパイル後のバイトコードを解析します。 例えば以下のようなソースがある場合 if (true) { PMDはソースコードを解析するので、このようなソースは [Do not use 'if' statements that are always true or always false.] と警告されます。 しかし、このようなソースをコンパイルするとコンパイラのデッド・コード除去という最適化によってバイトコードとして生成されません。 (デッド・コードのCoverageReport) よって、FindBugsではこのような処理はバグとして解析されません。 操作性両ツールとも、解析の実行は右クリックのメニューから行います。 ![]() また、両ツール共にプロジェクトのプロパティで「enable PMD」または「enable FindBugs」にチェックを付けると、保存のタイミングで解析を行ってくれます。 ![]() ![]() 言語PMDは基本的に全て英語です。 しかし、カスタマイズして日本語化させることも可能です。 その際にはxmlファイルにencodeの指定を入れないとうまく動作しないようです。 http://hp.vector.co.jp/authors/VA027994/igapyon/diary/2004/ig040225.html FindBugsは日本語のファイルがデフォルトで配布されますが、バグが多いようです。 このバグが原因でEclipseがプラグインを認識しないこともあります! 対策としてはmessages_ja.xmlを取り替えてしまうというのが有効です。 http://www.simeji.com/wiki/pukiwiki.php カスタマイズFindBugs・PMD共に解析させる項目を選択可能です。 各プロジェクト毎に個別のチェック項目を選択させることも出来ます。 PMDはさらに、各項目の重要度もカスタマイズ出来ます。 ![]() 実行速度画面数が5つのStrutsプロジェクト全体の解析にかかった時間。 (実行にはプロジェクト右クリックのメニューから実行) PMD:20秒 FindBugs:5秒 FindBugsのほうが早いです。 PMDの方が若干チェック項目数が多くなっていましたが、少々重いです。 但し、ソース保存時に実行される解析については両ツールとも早く、コーディング中にストレスを感じることは無さそうです。 ビューPMDのビューとFindBugsのビューは用途が違います。 PMDのニュー(PMD Violation)は、現在発生している解析エラー一覧を表示するものになってます。 ![]() PMDによって解析されるバグには重要度を5段階で設定させることが出来、ビュー右上の数字ボタンが重要度別表示のフィルターの役割を果たしています。 このPMD Violationビューは一覧件数が多い時(1000件くらい)は、非常に重たくなります。 このような場合はフィルターが必須になります。 それに対してFindBugsのビュー(Bug Details)です。 ![]() このビューは現在選択されているエラーの詳細が表示されていなす。 動作も快適に動きます。 ただし、FindBugsのビューをアクティブな状態にしたまま何かのビューを最大化すると、 対策:Eclipseのウインドウサイズを変えると戻ります! FindBugsのバグ。 解析項目最後に一番重要な解析項目です。 PMDは16のルール・セットとよばれるカテゴリが存在します。 どのカテゴリのチェックを使用するかという選択も可能です。 以下はそのなかでも代表的なルールセットです。
catchブロックは空であってはならない、equals()をオーバーライドする時には必ずhashCode()をオーバーライドする、等をチェックします。
変数名を短くしすぎない、メソッド名を長くしすぎない、クラス名の先頭は大文字にする、メソッド名やフィールド名の先頭は小文字にする、等のルールをチェックします。
深くネストしたifブロックは避けるべきである、パラメーターは再割り当てすべきではないなどの原則に合致しているかどうかをチェックします。
全てのルール・セットはここ↓に書いてます。 http://www-6.ibm.com/jp/developerworks/java/050121/j_j-pmd.html PMDの解析パターンはコーディング規約をチェックするようなパターンから、潜在的なバグを見つけるパターンまでかなり幅広いチェックパターンが用意されています。 ただし、デフォルトが全て英語表記なので少々戸惑うかもしれません。 一方、FindBugsの解析内容はほぼ潜在的なバグを見つけるパターンに絞っており、PMDに存在しないチェックパターンもあります。
さらに、デフォルトで日本語表記なのであまり戸惑うことも無いことを考えると、FindBugsのほうが使い勝手が良いかもしれません。 |