FindBugs, Checkstyle, PMDとJtestのルール比較資料 ~Jtestとオープンソースツールの違い、ルールマッピング表~ (簡易版)

はじめに

本書ではJtestの静的解析機能と他のオープンソースの静的解析ツールの検出ルールの比較を行った結果を掲載しています。特に本書ではJtestとオープンソースツールの比較、Jtestを用いることでどういった問題が検出できるかを記載しておりますので、オープンソースツールを既にお使いの方、Jtestをご検討中の方のご参考になりますと幸いです。
なお、本書には代表的なオープンソースの静的解析ツールとJtestのルールマッピング表を記載していますが、比較したツール間で同じ検出意図をもつルール(モジュール)をマップしたものであり、検出結果が同一となることを保証するものではありません。

Jtestとは

Jtestは、テスト工数の大幅削減とセキュアで高品質なJavaシステムの開発を強力にサポートするJava対応テストツールです。1,000 個以上のコーディングルールをもとにソースコードを静的に解析し、プログラムの問題点や特定の処理フローに潜む検出困難なエラーを検出します。また、2017年7月時点の最新版である10.3.1では、Javaの単体テストを支援するための単体テストアシスタント機能が追加され、JUnitベースの単体テストの作成や実行、結果の追跡が容易にできるようになりました。

Jtestとオープンソースツールの大きな違い

FindBugsやCheckstyle、PMDに搭載されているルールとJtestに搭載されているルールでは、検出できるルールが異なります。オープンソースツールと比較してJtestが得意とする問題検出は以下があります。
  • クラスやファイルをまたがった処理の解析(フロー解析)
  • フレームワーク独自の問題の検出
  • セキュリティ脆弱性に関する問題の検出
  • コードメトリクスに関する問題の検出
また、以下にオープンソースの静的解析ツール(FindBugs, Checkstyle, PMD)とJtestの検出できる問題のカテゴリ別のルール数を記載します。Jtestではコードの書き方に関する問題(コーディング規約チェック、フォーマットに関する問題)だけではなく、よりソフトウェアのバグにつながる可能性のあるコードを検出します。

※網羅率 = Jtestのルール数に対して、オープンソースが対応している割合(値が低いほどJtestでしか検出できないルールが多い)
※網羅率が20%以下のものを太字で記載


ルールのカテゴリ オープンソース Jtest 網羅率※ 備考
フロー解析※ 15 47 31.9% Jtestではクラスやファイルをまたがった処理を解析し問題を検出する。FindBugsはバイトコード解析を行うものの、精度が大きく違うため、比較することができない。
Bean 1 5 20.0%  
重複コード 2 6 33.3%  
コーディング規約 51 107 47.7%  
EJB 4 61 6.6% フレームワーク独自のルールはOSSが少ない。
例外 6 19 31.6%  
フォーマット 29 36 80.6% フォーマット系はOSSの網羅率が高い。
ガベージコレクション 4 12 33.3%  
グローバル解析 4 22 18.2%  
Hibernate 0 13 0.0% フレームワーク独自のルールはOSSが少ない。
初期化 5 14 35.7%  
国際化 3 17 17.6%  
Java Doc 14 25 56.0%  
JDBC 3 10 30.0%  
JUnit 16 27 59.3%  
メトリクス 0 23 0.0% メトリクスに関するルールはOSSでは少ない。
モバイル 0 17 0.0% モバイル関連のルールはJtestと重複しない。
命名規則 18 38 47.4%  
オブジェクト指向プログラミング 11 35 31.4%  
最適化 29 56 51.8%  
バグの可能性 75 139 54.0%  
移植性 3 9 33.3%  
プロパティファイル 2 17 11.8%  
セキュリティ 11 146 7.5% セキュリティ関連の網羅率は低い。
シリアライズ 10 17 58.8%  
サーブレット 2 17 11.8%  
Spring 0 11 0.0% フレームワーク独自のルールはOSSが少ない。
Struts 1 30 3.3% フレームワーク独自のルールはOSSが少ない。
スレッド 24 49 49.0%  
未使用コード 16 27 59.3%  
XML 0 2 0.0%  

本書ではオープンソースのツールとJtestのルール比較の情報を記載していますが、静的解析の精度についてはマッピング表から読み取ることはできません。JtestではFindBugsでは検出できない、クラスをまたがった処理を解析し、NullPointerExceptionやクロスサイトスクリプティングなどの致命的な問題を検出することができます。

Jtestの解析精度をお試しになりたい場合

本書の末尾に記載した技術資料および体験版をご利用ください。お試しになるお時間がない場合は、アセスメントとして実際のプロジェクトのコードに対して、弊社エンジニアがJtestの解析を行い、検出された問題の分析および報告を行うことができます。体験版およびアセスメントは無償でご利用になれます。この機会にぜひご利用をご検討ください。

ルールマッピング表

FindBugs、FindSecurityBugs、Checkstyle、PMDのルールとのマッピング表を記載します。
※ Microsoft EXCEL形式でのデータをご希望の方は、お問い合わせ先よりご連絡ください。

JtestとFindBugsのルールマッピング表(※Webでは一部のみ掲載)

この表はFindBugs 3.0.1 と Jtest 10.2.2 を比較した表です。FindBugsベースの表です。
注意)このマッピングは、両ツール間で同じ検出意図をもつルール(モジュール)をマップしたものであり、検出結果が同一となることを保証するものではありません。
Category 概要 対応状況 Jtest 10.2.2 Rule ID 備考
Bad practice equals メソッドは引数の型を仮定するべきではない X    
Bad practice ビット演算の符号をチェックする X    
Bad practice Cloneable を実装したクラスが clone メソッドを定義していないか、使用していない Cloneable クラスでは clone() throws CloneNotSupportedException を宣言する [CODSTA.OIM.CLONE-3]  
Bad practice clone メソッドが super.clone() を呼び出していない すべての clone() メソッドで super.clone() を呼び出す
[CODSTA.EPC.SCLONE-1]
 
Bad practice Cloneable を実装していないクラスが clone メソッドを定義している clone() メソッドを使用するのは、Cloneable インターフェイスの実装のためだけにする [CODSTA.OIM.CLONE2-3]  
Bad practice 既知の定数の雑な値を見つける X    
Bad practice 抽象クラスは共変な compareTo メソッドを定義している オーバーライドされるメソッドが引数型の違いによる予定外の共変ではないようにする [PB.CUB.IMC-3]  
Bad practice compareTo()/compare() は間違って float または double 値を処理する X    
Bad practice compareTo()/compare() は Integer.MIN_VALUE を返す X    
Bad practice 共変な compareTo メソッドの定義 オーバーライドされるメソッドが引数型の違いによる予定外の共変ではないようにする [PB.CUB.IMC-3]  
Bad practice 例外を捨てているかもしれないメソッド キャッチした例外を catch ブロックで必ず使用する [UC.UCATCH-3]  
Bad practice 例外を無視しているかもしれないメソッド キャッチした例外を catch ブロックで必ず使用する [UC.UCATCH-3]  
Bad practice エントリセットの要素を加えることは、Entry オブジェクトの再利用のために失敗するかもしれない X    
Bad practice Random オブジェクトが作成され1度しか使われない X    
Bad practice コレクションを消去するために removeAll メソッドを使用しない X    
Bad practice System.exit(...) を呼び出しているメソッド System.exit() を呼び出してはいけない [CODSTA.BP.EXIT-3]  
Bad practice 危険なメソッド runFinalizersOnExit を呼び出しているメソッド 安全ではない非推奨のメソッド Thread および Runtime を呼び出さない [TRS.THRD-2]  
Bad practice String パラメータを == や != を使用して比較している オブジェクト同士の比較に '==' または '!=' を使用しない [PB.CUB.UEIC-2]  
Bad practice String オブジェクトを == や != を使用して比較している オブジェクト同士の比較に '==' または '!=' を使用しない [PB.CUB.UEIC-2]  
Bad practice 抽象クラスは共変な equals メソッドを宣言している オーバーライドされるメソッドが引数型の違いによる予定外の共変ではないようにする [PB.CUB.IMC-3]  
Bad practice equals メソッドは互換性のないオペランドをチェックしている X    
Bad practice compareTo(...) メソッドを定義して Ob-ject.equals() を使用しているクラス X    

FindBugs, Checkstyle, PMDとJtestのルール比較資料

FindBugs、FindSecurityBugs、Checkstyle、PMDとJtestのルールマッピング情報をすべて含んだ、完全版資料のダウンロードをご希望の場合は以下URLよりダウンロードいただけます。
その他、ご不明点等ございましたらお問い合わせ先よりご連絡ください。

FindBugs、Checkstyle、PMDとJtestのルール比較資料完全版ダウンロード

技術資料および体験版

体験版

  • ご利用になれる期間は14日間です。
  • 本書でご紹介したコードカバレッジ計測や、その他の機能である静的フロー解析を含む、すべての機能を無償でご利用いただけます。
  • ご評価を円滑に進めるための技術的なお問い合わせも受け付けております。

技術資料

以下の技術資料をご提供しております。
  • ソフトウェアの品質を向上させるためのアイデアや事例などの技術情報
  • 過去に開催したセミナーのプレゼンテーション資料

お問い合わせ

  • テクマトリックス株式会社
    東京本社

    システムエンジニアリング事業部
    ソフトウェアエンジニアリング営業部

    03-4405-7853

メールでのお問い合わせ
parasoft-info@techmatrix.co.jp
  • HOME
  • FindBugs, Checkstyle, PMDとJtestのルール比較資料 ~Jtestとオープンソースツールの違い、ルールマッピング表~ (簡易版)