静的分析ツールでは、CPD、PMD、FindBugs、Checkstyleをよく使用します。
CPDは、PMDの「コピー/貼り付け検出」ツールです。PMDをしばらく使用していたのは、PMD Webページの[ Finding Duplicated Code]リンクに気づく前でした。
これらのツールは、「すぐに使える」一連のルールを超えて拡張できる場合があることを指摘しておきます。オープンソースだからといって、書き直せるわけではありません。これらのツールの一部には、拡張を可能にするアプリケーションまたは「フック」が付属しています。たとえば、PMDには、新しいルールを作成できる「デザイナー」ツールが付属しています。また、Checkstyleには、大幅なカスタマイズを可能にするプロパティを持つDescendantTokenチェックがあります。
これらのツールをAntベースのビルドと統合します。リンクをクリックすると、私のコメント付き構成を確認できます。
ビルドへの単純な統合に加えて、他のいくつかの方法でツールをいくらか「統合」するように構成すると便利です。つまり、レポート生成と警告抑制の均一性です。これらの側面をこのディスカッションに追加したいと思います(おそらく「static-analysis」タグも必要です)。「統一された」ソリューションを作成するために、これらのツールをどのように構成していますか?(私はここでこの質問を個別に尋ねました)
最初に、警告レポートの場合、各警告が単純な形式になるように出力を変換します。
/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.
コメントにとって重要なのは「」部分だけですが、@SuppressWarning
名前による個々のルール違反を認識する注釈に対するPMDのサポートと一致しています。
@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が必要とするクラスファイルにアノテーションを保持するほど強力ではない保持ポリシーがあるためです。Javaの@SuppressWarnings
注釈との衝突を回避するために、FindBugs警告抑制を完全に修飾します。
@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
これらの手法により、ツール間でかなり一貫性があるように見えます。各警告抑制に文字列 " SuppressWarnings
"が含まれていると、コードベース全体ですべてのツールのすべてのインスタンスを検索する簡単な検索を簡単に実行できることに注意してください。