静的コード解析でコードの改善を行う

コードレビューはしたことがあるでしょうか。
変なコードを書いていないかを確認するためにだれかにコードを確認してもらうという事はよくやります。

誰かにコードを見てもらえるのが一番良いのですが、その誰かがいない場合、機械的にコードを解析して変なところがないかを確認してもらうことが出来ます。

それが静的コード解析です。

Javaでは多くの静的コード解析ツールがあり、多くは無償で利用することが出来ます。

今回はそのうちのFindBugsとPMDを利用して静的コード解析をしてみたいと思います。

FindBugs

FindBugsコンパイルされたバイナリを解析し、不具合を検出してくれます。
例えば、

if("str" == "str")〜〜

という書き方は良くなく、Javaでは以下のように記載する必要があります。

f("str".equals("str"))〜〜

こういった問題点を検出してくれます。

実際にどういうものが検出されるかは以下を参照して下さい。
http://findbugs.sourceforge.net/bugDescriptions_ja.html

PMD

PMDはコードを解析し、不具合や、複雑性を検出してくれます。
FindBugsと同様に不具合を検出してくれますが、検出できる不具合の種類はFindBugsほどではないため、不具合はFindBugsで検出し、ソースコードの複雑性を検出するのに使うのが良いでしょう。

ソースコードの複雑性

ソースコードの複雑性という言葉を使いましたが、ソースコードの複雑性とは、if文やfor文が多用されており、多数の処理が一度に行われている事を示します。複雑であるコードは不具合をたくさん抱えている可能性が高くメソッド分割をし、シンプルな実装にしたほうが良いです。

ソースコードの複雑性とバグの関係については以下を参照して下さい。
http://szk-takanori.hatenablog.com/entry/20111219/p1

使用方法と使い分けと設定

私はFindBugsで基本的なバグになりそうなコードの洗い出しをし、PMDで複雑すぎるコードを検出します。

FindBugs

基本的にはデフォルトで運用します。

PMD

以下の2つを検出するようにします。

  1. Cyclomatic Complexcity

循環的複雑度で複雑なもの(デフォルトだと10以上)を検出します。
http://szk-takanori.hatenablog.com/entry/20111219/p1

  1. NPath Complexcity

分岐の数が多いもの(デフォルトだと200以上)を検出します。分岐の数が多いということはC2レベルでのテストケース作成が難しくなることを示します。

使用方法

FIndBugsについてはEclipse(Pleiades入りで日本語化されているもの)、NetBeansである場合はデフォルトで入っています。プロジェクトを右クリックすると実行できると思いますので実行して下さい。
PMDについてはプラグインを追加する必要があります。
NetBeansで実行する場合は以下を参照してください。
http://www.torutk.com/projects/swe/wiki/NetBeans_PMD

以下には、mavenから実行する場合の設定例を記載します。

    <reporting>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <linkXref>true</linkXref>
                    <sourceEncoding>utf-8</sourceEncoding>
                    <targetJdk>1.8</targetJdk>
                    <rulesets>
                        <ruleset>https://gist.githubusercontent.com/megascus/8df9d6f7c39e46c453bb/raw/39fac2d082a15bb2165288f67be5d538bb75fee4/Complexcity.xml</ruleset>
                    </rulesets>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>findbugs-maven-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <xmlOutput>true</xmlOutput>
                </configuration>
            </plugin>
        </plugins>
    </reporting>

mvn site
と入力することで、レポートが出力されます。
すべての設定については以下を参照して下さい。
https://gist.githubusercontent.com/megascus/8bea74b019bcc75f081f/raw/1ba0c9927c0e1d297591488ec90c3e4cc1dfd48f/pom.xml