Menu

FrontPage

Eclipseプラグイン
Eclipse小技集
リファクタリング講座
テスティングフレームワーク JUnit
MSDEについて



The 20 newest affair
2010-09-092010-09-082010-09-072010-09-062010-09-012010-08-312010-08-272010-08-242010-08-232010-08-172010-08-162010-07-302010-07-212010-07-132010-06-272010-06-182010-06-172010-06-16

PMD vs FindBugs


オープン・ソースの静的解析ツール「PMD」と「FindBugs」の比較。

PMD


PMD: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) {
  System.out.println("メッセージ");
}

PMDはソースコードを解析するので、このようなソースは

[Do not use 'if' statements that are always true or always false.]

と警告されます。

しかし、このようなソースをコンパイルするとコンパイラのデッド・コード除去という最適化によってバイトコードとして生成されません。
デッド・コードのCoverageReport

よって、FindBugsではこのような処理はバグとして解析されません。


操作性


両ツールとも、解析の実行は右クリックのメニューから行います。

[706D64312E706E67.png]


また、両ツール共にプロジェクトのプロパティで「enable PMD」または「enable FindBugs」にチェックを付けると、保存のタイミングで解析を行ってくれます。

[706D64322E706E67.png]

[706D64332E706E67.png]


言語


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はさらに、各項目の重要度もカスタマイズ出来ます。

[706D64342E706E67.png]


実行速度


画面数が5つのStrutsプロジェクト全体の解析にかかった時間。
(実行にはプロジェクト右クリックのメニューから実行)

PMD:20秒
FindBugs:5秒

FindBugsのほうが早いです。
PMDの方が若干チェック項目数が多くなっていましたが、少々重いです。

但し、ソース保存時に実行される解析については両ツールとも早く、コーディング中にストレスを感じることは無さそうです。


ビュー


PMDのビューとFindBugsのビューは用途が違います。

PMDのニュー(PMD Violation)は、現在発生している解析エラー一覧を表示するものになってます。

[706D64352E706E67.png]

PMDによって解析されるバグには重要度を5段階で設定させることが出来、ビュー右上の数字ボタンが重要度別表示のフィルターの役割を果たしています。

このPMD Violationビューは一覧件数が多い時(1000件くらい)は、非常に重たくなります。
このような場合はフィルターが必須になります。


それに対してFindBugsのビュー(Bug Details)です。

[706D64362E706E67.png]

このビューは現在選択されているエラーの詳細が表示されていなす。
動作も快適に動きます。

ただし、FindBugsのビューをアクティブな状態にしたまま何かのビューを最大化すると、どうすることもできなくなってしまいます

対策:Eclipseのウインドウサイズを変えると戻ります!

FindBugsのバグ。



解析項目


最後に一番重要な解析項目です。

PMDは16のルール・セットとよばれるカテゴリが存在します。
どのカテゴリのチェックを使用するかという選択も可能です。

以下はそのなかでも代表的なルールセットです。

  • 基本ルール・セット (rulesets/basic.xml)
恐らく大部分の開発者が納得する、多種多様なルールです。
catchブロックは空であってはならない、equals()をオーバーライドする時には必ずhashCode()をオーバーライドする、等をチェックします。

  • 名前付けに対するルール・セット (rulesets/naming.xml)
Javaにおける、標準的な名前付けに関するテストです。
変数名を短くしすぎない、メソッド名を長くしすぎない、クラス名の先頭は大文字にする、メソッド名やフィールド名の先頭は小文字にする、等のルールをチェックします。

  • 未使用コードに対するルール・セット (rulesets/unusedcode.xml)
読まれることのないプライベート・フィールドとローカル変数、到達不能ステートメント、呼ばれることのないプライベート・メソッド等を探します。

  • 設計に対するルール・セット (rulesets/design.xml)
良い設計とするための、様々な原則をチェックします。
深くネストしたifブロックは避けるべきである、パラメーターは再割り当てすべきではないなどの原則に合致しているかどうかをチェックします。

  • インポート・ステートメントに対するルール・セット (rulesets/imports.xml)
同じクラスを2度インポートしたり、java.langからクラスをインポートしたりといった、インポート・ステートメントにおけるマイナーな問題をチェックします。

  • JUnitテストに対するルール・セット (rulesets/junit.xml)
メソッド名の綴りが正しいかどうか、suite()メソッドが静的でパブリックかどうかなど、テスト・ケースやテスト・メソッドに固有の問題を探します。

  • ストリングに対するルール・セット (rulesets/string.xml)
文字列リテラルが重複したり、Stringコンストラクターを呼んだり、Stringオブジェクトに対してtoString()を呼んだり、といった、文字列を扱う時に起きてくる一般的な問題を特定します。

  • カッコに対するルール・セット (rulesets/braces.xml)
forやif、それにwhileやelseなどのステートメントがカッコを使っているかどうかをチェックします。

  • コード・サイズに対するルール・セット (rulesets/codesize.xml)
異常に長いメソッドや、メソッドが多すぎるクラス、またこれらに類似した、リファクターの元になりそうなものをテストします。


全てのルール・セットはここ↓に書いてます。
http://www-6.ibm.com/jp/developerworks/java/050121/j_j-pmd.html


PMDの解析パターンはコーディング規約をチェックするようなパターンから、潜在的なバグを見つけるパターンまでかなり幅広いチェックパターンが用意されています。
ただし、デフォルトが全て英語表記なので少々戸惑うかもしれません。

一方、FindBugsの解析内容はほぼ潜在的なバグを見つけるパターンに絞っており、PMDに存在しないチェックパターンもあります。

  • メソッド内でnullポインタを参照外し
  • 大文字小文字の違いだけのメソッド名
  • 配列を返すメソッドでは、nullよりもサイズ0の配列を返すべき
  • メソッドの戻り値を無視している
  • フィールドは final ではありませんが、finalに変更すべき

さらに、デフォルトで日本語表記なのであまり戸惑うことも無いことを考えると、FindBugsのほうが使い勝手が良いかもしれません。


Attached File: [Attached File All List] pmd1.png[65KB] pmd2.png[38KB] pmd3.png[35KB] pmd4.png[35KB] pmd5.png[59KB] pmd6.png[83KB]

Lastmodified: 2007-05-05 (土) 08:15:12 (1223d)