静的分析ツールには、CPD、PMD、FindBugs、およびCheckstyleをよく使用します。
CPDは、PMDの「コピー/貼り付け検出器」ツールです。PMD Webページの「重複コードの検索」リンクに気付く前に、しばらくの間PMDを使用していました。
これらのツールは、「すぐに使える」一連のルールを超えて拡張できる場合があることを指摘したいと思います。そして、それらがオープンソースであるという理由だけでなく、それらを書き直すことができます。これらのツールの一部には、拡張を可能にするアプリケーションまたは「フック」が付属しています。たとえば、PMDには、新しいルールを作成できる「デザイナ」ツールが付属しています。また、Checkstyleには、大幅なカスタマイズを可能にするプロパティを持つDescendantTokenチェックがあります。
これらのツールをAntベースのビルドと統合します。リンクをたどると、コメントされた構成を確認できます。
ビルドへの単純な統合に加えて、他のいくつかの方法でツールをある程度「統合」するように構成すると便利です。つまり、レポートの生成と警告の抑制の均一性。これらの側面をこのディスカッションに追加したいと思います(おそらく「静的分析」タグも必要です):「統一された」ソリューションを作成するために、これらのツールをどのように構成しているのでしょうか。(私はここで別々にこの質問をしました)
まず、警告レポートの場合、各警告が単純な形式になるように出力を変換します。
/absolute-path/filename:line-number:column-number: warning(tool-name): message
これはしばしば「Emacsフォーマット」と呼ばれますが、Emacsを使用していない場合でも、レポートを均質化するための妥当なフォーマットです。例えば:
/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.
警告形式の変換は、Antフィルターチェーンを使用したAntスクリプトによって行われます。
私が行う2番目の「統合」は、警告の抑制です。デフォルトでは、各ツールは、無視したい警告を消音するためにコードに配置できるコメントまたは注釈(あるいはその両方)をサポートしています。しかし、これらのさまざまな警告抑制要求は、一貫した外観を持たず、ややばかげているように見えます。警告を抑制しているときは、警告を抑制しているので、常に「SuppressWarning
?」と書いてはいけません。
たとえば、PMDのデフォルト設定NOPMD
では、コメントに文字列「」が含まれるコード行での警告の生成が抑制されています。また、PMDはJavaの@SuppressWarnings
注釈をサポートしています。PMD抑制が同じように見えるように、SuppressWarning(PMD.
代わりに「」を含むコメントを使用するようにPMDを構成します。NOPMD
コメントスタイル抑制を使用するときに違反する特定のルールを入力します。
// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained
コメントにとって重要なのは「」の部分だけですが、名前で個々のルール違反を認識する注釈に対するSuppressWarnings(PMD.
PMDのサポートと一致しています。@SuppressWarning
@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended
同様に、Checkstyleは、コメントのペア間の警告の生成を抑制します(注釈のサポートは提供されません)。デフォルトでは、Checkstyleをオフおよびオンにするコメントには、それぞれ文字列CHECKSTYLE:OFF
とが含まれていますCHECKSTYLE:ON
。この構成を(Checkstyleの「SuppressionCommentFilter」を使用して)文字列「BEGIN SuppressWarnings(CheckStyle.
」および「END SuppressWarnings(CheckStyle.
」を使用するように変更すると、コントロールがPMDのようになります。
// BEGIN SuppressWarnings(Checkstyle.HiddenField) justification: "Effective Java," 2nd ed., Bloch, Item 2
// END SuppressWarnings(Checkstyle.HiddenField)
Checkstyleコメントでは、各チェックに独自の " "コメントペアがあるため、特定のチェック違反( HiddenField
)は重要です。BEGIN/END
FindBugsは、注釈付きの警告生成抑制もサポートしている@SuppressWarnings
ため、他のツールとある程度の均一性を実現するために、これ以上の構成は必要ありません。残念ながら、Findbugsはカスタム@SuppressWarnings
アノテーションをサポートする必要があります。これは、組み込みのJava@SuppressWarnings
アノテーションには、SOURCE
FindBugsが必要とするクラスファイルにアノテーションを保持するのに十分な強度がない保持ポリシーがあるためです。@SuppressWarnings
Javaのアノテーションとの衝突を避けるために、FindBugsの警告抑制を完全に修飾します。
@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
これらの手法により、ツール間で物事が合理的に一貫しているように見えます。各警告抑制に文字列" SuppressWarnings
"が含まれていると、コードベース全体ですべてのツールのすべてのインスタンスを見つけるための簡単な検索を簡単に実行できることに注意してください。