本格派エンジニアの工具箱

第17回「Software Quality Environment」よる静的解析でソースコードの品質を向上させる

パッケージの依存関係を可視化する「Dependency Finder」

前回に引き続き、NetBeans向けの静的コード解析ツールであるSoftware Quality Environment⁠以下、SQE)を紹介します。

SQEに付属する4つのツールのうちのひとつ、Dependency Finderは、コンパイル済みのJavaコードからパッケージの依存関係を解析して可視化するツールです。もともとのツールは依存関係をXML形式やHTML形式またはテキスト形式で出力するものですが、SQEに含まれるNetBeansプラグインではグラフ状のマップとして出力する機能が提供されます。

Dependency Finderによる解析は、プロジェクト名を右クリックして、メニューから[Quality⁠⁠-⁠DependencyAnalysis⁠⁠-⁠Run DependencyFinder]を選択することで実行します。解析が完了すると、Dependenciesウィンドウが表示されて、パッケージの依存関係がグラフ表示されます。上部の[JDK]スイッチをオンにするとJDKの標準ライブラリが、⁠External]をオンにすると外部ライブラリがそれぞれ図1に表示されるようになります。これによって使われているパッケージや、ライブラリ間の依存関係などが一目で把握することが可能です。

図1 Dependency Finderによる依存関係マップの生成
図1 Dependency Finderによる依存関係マップの生成

ソースコードからバグを見つける「PMD」

PMDは、Javaのソースコードを解析し、バグを発生させやすいコードパターンを見つけ出して警告することによって、プログラムの品質を確保する静的解析ツールです。単体テストのようにテストコードを実行させてエラーを検出するのではなく、あくまでもソースコードの解析によって、バグが起こりやすいとされるコードを除去するのが目的です。したがって、PMDによってエラーが検出されたコードでも、実際にはバグの発生につながらないケースもあります。

PMDでは、たとえば次のようなコードパターンが検出の対象となります。

  • 空のtry/catch/finally/switchステートメント
  • 使用していないローカル変数やメソッドパラメータ、privateメソッドなど
  • 非効率なString/StringBufferの使い方
  • 不必要なif文や、whileで事足りるfor文の使い方
  • 不必要にコピー&ペーストされたコード

その他にも膨大な種類のコードパターンが用意されており、どのパターンの検出を有効/無効にするのかは、⁠ツール⁠⁠-⁠オプション]メニューの[Quality]タブの画面で選択することができます図2⁠。

図2 PMDによるコード解析の設定項目
図2 PMDによるコード解析の設定項目

PMDによる解析は、プロジェクト名を右クリックして、メニューから[Quality⁠⁠-⁠CodeDefects⁠⁠-⁠Run PMD]を選択することで実行します。解析が完了すると、⁠PMD]ウィンドウに図3のように検出されたコードの一覧が表示されます。対象のコードパターンがあるクラス名と行番号が表示されており、ダブルクリックすることでソースコードエディタ上の該当の箇所にカーソルを飛ばすことができます。

図3 PMDによる解析結果の例
図3 PMDによる解析結果の例

エディタ上では、図4のように検出された警告の内容がコードヒントとして表示されるので、該当箇所が一目で分かるようになっています。

図4 ソースコードエディタ上ではコードヒントとして警告が表示される
図4 ソースコードエディタ上ではコードヒントとして警告が表示される

バイトコードからバグを見つける「FindBugs」

FindBugsは、PMDと同様にコードパターンから潜在的なバグを検出する静的コード解析ツールです。PMDとの違いは、PMDがソースコードそのものを解析するのに対して、FindBugsではコンパイル済みのバイトコードを対象に解析を行うという点です。PMDで検出されるパターンのコードであっても、コンパイラの最適化などによってバイトコードレベルではコードが書き換わっている場合があります。そのようなコードの場合、FindBugsでは検出の対象になりません。

FindBugsで検出するコードパターンは、⁠ツール⁠⁠-⁠オプション]メニューの[Quality]タブの画面で有効/無効を選択することができます図5⁠。パターンごとに解析にかかる時間がfast(高速)/moderate(中速)/slow(低速)のいずれかで表示されているので、設定の際に参考にするといいでしょう。FindBugsプロジェクトでは日本語化作業が進められているため、一部の設定項目や警告内容は日本語で表示されます。

図5 FindBugsによるコード解析の設定項目
図5 FindBugsによるコード解析の設定項目

FindBugsによる解析は、プロジェクト名を右クリックして、メニューから[Quality⁠⁠-[CodeDefects⁠⁠-[Run FindBugs]を選択することで実行します。解析が完了すると、[FindBugs]ウィンドウに図6のように検出内容が表示されます。また、PMDと同様にソースコードエディタ上では図7のように警告の内容がコードヒントとして表示されます。

図6 FindBugsによるコード解析の設定項目
図6 FindBugsによるコード解析の設定項目
図7 ソースコードエディタ上ではコードヒントとして警告が表示される
図7 ソースコードエディタ上ではコードヒントとして警告が表示される

ダッシュボードでコードの品質を確認する

SQEには、コードの品質管理の様子を確認するためのダッシュボードとして「Quality Control Center」という画面が用意されています。この画面は、[ウィンドウ]メニューから[Quality⁠⁠-[Quality Control Center]を選択することで表示できます。Quality Control Centerでは、図8のように各ツールによる警告がどの程度残っているのかを一目で確認できるようになっています。また上部の4つのアイコンのうち、右から2番目のアイコンをクリックすることで、解析結果のスナップショットを撮ることができます。これによって解析の履歴を残すことができ、警告数の推移を下部のグラフで確認することが可能になります。

図8 コード品質管理のダッシュボードとなるQuality Control Center
図8 コード品質管理のダッシュボードとなるQuality Control Center

SQEに含まれる4つのツールは、それぞれ単体で利用することもできます。しかしこれらを同時に使い、異なる視点からソースコードの検証を行うことができる点がSQEの魅力と言えます。導入が容易であり、使い慣れた統合開発環境の中で利用できるという点も大きなメリットです。アプリケーションの品質を向上させるために、SQEのような静的コード検証ツールの導入も検討してみてはいかがでしょうか。

おすすめ記事

記事・ニュース一覧