web-dev-qa-db-ja.com

PMDとFindBugsの違いは何ですか?

PMDとCheckStyleを比較する質問 がありました。ただし、PMDとFindBugsの相違点/類似点についてのニースの内訳は見つかりません。主な違いは、PMDはソースコードで動作し、FindBugsはコンパイルされたバイトコードファイルで動作することです。しかし、機能に関しては、どちらかまたは両方の選択肢である必要がありますか、それとも互いに補完するのでしょうか?

104
Thomas Owens

私は両方を使用しています。それらは互いに補完し合っていると思います。

あなたが言ったように、 [〜#〜] pmd [〜#〜] はソースコードで動作し、したがって命名規則の違反、中括弧の欠如、ヌルチェックの置き忘れ、長いパラメーターリスト、不必要なコンストラクター、スイッチのブレークの欠落など。PMDは、コードの Cyclomaticの複雑さ についても教えてくれます(FindBugsはCyclomaticの複雑さについて教えてくれません)。

FindBugs はバイトコードで動作します。 FindBugsがPMDで見つけられない問題を以下に示します:equals()メソッドはサブタイプで失敗します。cloneメソッドはnullを返す場合があります。それ自体を含むコレクション、equalsメソッドは常にtrue、無限ループなどを返します。

通常、それぞれが異なる問題のセットを見つけます。両方を使う。これらのツールは、良いJavaコード。

142
snakile

PMDの最良の機能は、XPathルールであり、Rule Designerにバンドルされており、コードサンプルから新しいルールを簡単に構築できます(RegExおよびXPath GUIビルダーと同様)。 FindBugsはすぐに使用できますが、プロジェクト固有のルールとパターンを構築することは非常に重要です。

たとえば、2つのネストされたforループを含むパフォーマンスの問題が発生し、O(n ^ 2)の実行時間が発生しましたが、これは簡単に回避できます。 PMDを使用してアドホッククエリを作成し、ネストされたforループの他のインスタンスを確認します-// ForStatement/Statement // ForStatement。これは、問題のさらに2つのインスタンスを指摘しました。これは一般的なルールではありません。

22
Dekel

PMDは

  • 有名な
  • 業界で広く使用されている
  • xmlにルールを追加できます
  • エラーレベルと警告レベルで詳細な分析を提供します
  • コードをスキャンして「行をコピーして貼り付ける」こともできます。コードが重複しています。これにより、Java oops。
3
kunal saxena