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


107

PMDとCheckStyleを比較する質問がありました。ただし、PMDとFindBugsの違い/類似性については、うまく分類できません。主な違いは、PMDがソースコードで機能するのに対し、FindBugsはコンパイル済みバイトコードファイルで機能することです。しかし、機能に関しては、どちらか一方または両方の選択である必要がありますか、それとも互いに補完し合うのでしょうか?

回答:


151

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

あなたが言ったように、PMDはソースコードで動作するため、命名規則の違反、中括弧の欠如、nullチェックの誤配置、長いパラメーターリスト、不必要なコンストラクター、スイッチの欠落などを検出します。PMDは、Cyclomaticについても通知します私のコードが非常に役立つコードの複雑さ(FindBugsはCyclomaticの複雑さについて教えてくれません)。

FindBugsはバイトコードで動作します。FindBugsがPMDが検出しないいくつかの問題を次に示します。equals()メソッドはサブタイプで失敗し、クローンメソッドはnullを返す可能性があります。ブール値の参照比較、不可能なキャスト、32ビットの整数が0〜31の範囲ではない量だけシフトされます。それ自体を含むコレクション、equalsメソッドは常にtrue、無限ループなどを返します。

通常、それぞれが異なる問題のセットを見つけます。両方を使う。これらのツールは、優れたJavaコードの作成方法について多くのことを教えてくれました。


コレクションにそれ自体が含まれているときに表示された特定のエラーコードは何ですか?それがFindBugsによる推定バグとマークされたのはなぜですか?
オタク

Sonarqube 6.3はもう不要です... SonarqubeはJava 8を必要とし、FindbugsはまだJava 7しかサポートしていません
Markus

22

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

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


2

PMDは

  • 有名な
  • 業界で広く使用されています
  • あなたはxmlでルールを追加することができます
  • エラーレベルと警告レベルの詳細な分析を提供します
  • コードをスキャンして「行をコピーして貼り付ける」こともできます。コードが重複しています。これは、java oopsの実装に関する良い考えを与えます。

FindBugsに話しかけません。問題セットが同一ではないため、それらは補完的です。
1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.