G*Magazine Vol.1

CodeNarcを利用してGROOVYのコード品質を上げる ~第1回 CodeNarcとは~

静的コード解析とは

Codenarkは、Groovyで作成された、Groovy向けの静的コード解析ツールである。

静的コード解析は、プログラムを実行せずにソースコードを構造的に解析し、一般的に知られているコードの問題が解析対象のソースコードに存在していないかをチェックすることである。ここでいう一般的に知られているコードの問題は、拡張性低下の原因となるコード、性能劣化の原因となるコード、セキュリティの脆弱性を持つコードやコーディング規約に準拠していないコードを指す。オープンソースの静的コード解析ツールとして、Java向けに、「PMD (http://pmd.sourceforge.net/)」、「CheckStyle (http://checkstyle.sourceforge.net/)」、「FindBugs (http://findbugs.sourceforge.net/)」や「Jlint (http://jlint.sourceforge.net/)」などがある。これらのツールの違いは、「どのようなコードの問題を検証するのが得意か」という点で異なっている。FindBugsやJlintは、潜在的なバグを検証することを主眼としている。一方、CheckStyleはコーディング規約(コメントの書き方等)の問題を検証することを主な目標としている。PMDは汎用的な(幅広い)問題を検証することを目標としている。Groovy向けの静的コード解析ツールとして、IntelliJ IDEA(http://www.jetbrains.com/idea/) にバンドルされた静的コード解析ツールがある。 このツールは、IDEのIntelliJ上で静的コード解析を実行することを目標としている。

PMD、CheckStyleやIntteliJ IDEAにバンドルされた静的コード解析ツール の影響を受けて開発されていることを考慮すると、CodeNarkは、汎用的な問題を検証し、汎用的な用途で利用できる静的コード解析ツールを目標としていると考えることができる。

また、商用の静的コード解析ツールとしては、「Fortify SCA (https://www.fortify.com/)」、「Coverity (http://www.coverity.com/html_ja/)」などがある。オープンソースと商用の差は、結果の表示手法の違い、コード解析の深さの違い(ファイルやクラス間にまたがるデータフローを解析できるか等)やルールの違い(*ルールについては後述)などがある。Groovyのコードを解析することが可能な商用の静的コード解析ツールは私が調査した限りでは存在しない。

設計上の問題とコードの問題

前述した一般的に知られているコードの問題は、単体テストや結合テストと呼ばれるテストでみつけるものだと考える方が多いかもしれない。

しかし、テストのみで拡張性の低下となるコードや性能劣化の原因となるコードが発見できるだろうか。たしかに性能劣化の原因となるコードの一部分はパフォーマンステスト等で発見できるかもしれないが、それは問題の一部分である。

テストと静的コード解析は目標としていることが本質的に違う。テストは、バグすなわち設計上の問題点を検出することを目標としている。すなわち、ユーザの要件通りにソフトウエアが実行されることを検証している。一方、静的コード解析は、コードの品質が高いかの検証、すなわち、非機能要件について検証をしている。設計上の問題とコードの問題のイメージは下図のようになる。

また、静的コード解析はプログラムを実行することなく実行することができるので、単体テスト、結合テストなどのテストより前、コードを1行書き始めた時から実行することが可能である。したがって発見された問題点による手戻りが少なくなるというメリットがある。参考までに、ソフトウエア開発の工程で手戻りが発生した場合のコストの例を以下に示す。出典は、「Soo Hoo, Kevin, Andrew W. Sudbury, and Andrew R. Jaquith. "Tangible ROI through Secure Software Engineering." Secure Business Quarterly. 1-2. 2001.」である。

静的コード解析ツールのまとめ

以上をまとめると、静的コード解析はテストで検証することが難しいコードの問題を検証し、開発の早い段階で問題点を検証できるということである。

CodeNarcのルール

CodeNarcは、一般的な静的コード解析ツールと同様に静的コード解析をルールに従って実施する。解析に使用するルールはCodeNarcに標準で付属しているルール及びCodeNarcの仕様に従って作成したルールを使用することができる。静的解析ごとに使用するルールを切り替えることも可能である。

CodeNarcに標準で付属しているルールは、http://codenarc.sourceforge.net/codenarc-rules-basic.htmlの左メニューのRulesから参照することが可能である。

このコラムの内容

第1回は、CodeNarcの基本的な実行方法を紹介し、第2回以降でルールのカスタマイズ方法や各種プラグインの利用方法を紹介する。

基本的な実行方法

CodeNarcを実行するためには、以下のものを用意しておく必要がある。Log4JのバイナリがCodeNarcに付属していることを考慮すると、Groovyの実行環境を構築している方であれば、CodeNarcをダウンロードすれば他に用意するものはない。

  • Groovy 1.7 以上
  • Java1.5以上
  • Log4J1.2.13以降(CodeNarcのtarballに付属)

CodeNarcは、コマンドラインからの実行以外にも様々な実行方法がある。今回は、CodeNarcの基本的な動作を理解するという観点から、CodeNardに付属しているサンプルを利用して、「コマンドラインからの実行」と「Antタスクとしての実行」を紹介する。ここでは、windows環境にgroovyの環境設定が終了している、CodeNarc-0.12を利用している前提で話を進める。

CodeNarcのダウンロード

http://sourceforge.net/projects/codenarc/files/からCodeNarc-(バージョン番号)-bin.zipのファイルをダウンロードし任意のディレクトリに解凍する。

コマンドランインからの実行

コマンドラインからの実行は、CodeNarcをJavaの実行ファイルとして実行する。その際に、以下を設定する必要がある。

  • GroovyのJarファイル
  • CodeNarcのjarファイル
  • Log4Jのjarファイル

CodeNarkに付属しているsampleに対して静的コード解析を実行する例は次の通りである。

(展開したディレクトリ)samplesに移動し、以下のようにRunCodeNarc.batを編集する。

@set GROOVY_JAR="%GROOVY_HOME%/embeddable/groovy-all-1.7.6.jar"
java -classpath %GROOVY_JAR%;../CodeNarc-0.12.jar;../lib/log4j-1.2.13.jar org.codenarc.CodeNarc -title=HelloCodeNarc %*

1行目は、groovyのjarファイルの場所を指定している。2行目は、CodeNarcのjarファイルの位置、Log4Jのjarファイルの位置及びCodeNarcのオプションを指定している。指定可能なCodeNarcのオプションは以下の表の通りである。オプションを指定しなかった場合は、表に記述してあるデフォルトの値で動作する。

パラメータ説明デフォルト
-basedir=DIR解析対象のベースディレクトリを指定する。-basedir=src/main/groovyカレントディレクトリ(.)
-includes=PATTERNS解析対象ファイルのパターンをAnt形式で指定する。-includes=**/*.gr.groovyファイルすべて(**/*.groovy)
-excludes=PATTERNS解析対象からはずすファイルのパターンをAnt形式で指定する。-excludes=**/templates/**, **/*Test.*指定なし
-rulesetfiles=FILENAMES解析するルールを指定する。このオプションでルールのON-OFFをルールセット単位で指定できる。-rulesetfiles=rulesets/imports.xml, rulesets/naming.xmlrulesets/basic.xml
-report=REPORT-TYPE[:FILENAME]結果の出力形式をTYPE[:FILENAME]で指定する。
TYPEは、 "html", "xml", "text", "console" のいずれかで設定する。出力タイプを独自に定義した場合は、定義したクラスを指定することが可能である。(例:org.codenarc.report.ReportWriter)
FILENAME は出力ファイルのファイル名を指定する。
-report=html
-report=html:MyProject.html
-report=xml
-report=xml:MyXmlReport.xml
-report=org.codenarc.report. HtmlReportWriter
html
-title=REPORT TITLE出力するプロジェクト名を指定する。-title="My Project"指定なし
-helpこの表のヘルプを表示する。-help指定なし

編集したbatファイルを実行すると、実行したディレクトリ直下に、「CodeNarcReport.html」が作成される。このファイルをブラウザ等で開くことによって、以下のような分析結果を参照することが可能である。

Antタスクとしての実行

AntのタスクとしてCodeNarcを実行することが可能である。Antタスクは、build.xmlにCodeNarcエレメント、reportエレメント及びfilesetエレメントを記述することによって定義する。各エレメントの詳細は、http://codenarc.sourceforge.net/codenarc-ant-task.htmlを参照のこと。定義したエレメントを実行する際は、コマンドラインから実行するときと同様にant -libオプションで、GroovyのJarファイル、CodeNarcのjarファイル及びLog4Jのjarファイルを指定する必要がある。

CodeNarkに付属しているsampleに対して、Antタスクを利用して静的コード解析を実行する例は次の通りである。

(展開したディレクトリ)samplesに移動し、以下のように、build.xml及びRunAntTask.batを編集する。

build.xml
<project name="HelloCodeNarc" >
<taskdef name="codenarc" classname="org.codenarc.ant.CodeNarcTask"/>
<target name="runCodeNarc">
<mkdir dir="reports"/>
    <codenarc
            ruleSetFiles="rulesets/basic.xml,rulesets/exceptions.xml,rulesets/imports.xml,rulesets/braces.xml">
		<report type="html" toFile="reports/CodeNarcAntReport.html" title="My Sample Code"/>
		<fileset dir="src">
			<include name="**/*.groovy"/>
		</fileset>
	</codenarc>
	<echo message="Done."/>
</target>
</project>

codenarcエレメントで解析に使用するルールを指定、reportエレメントで出力形式を指定、filesetエレメントで解析対象ファイルを設定している。

RunAntTask.bat
set GROOVY="%GROOVY_HOME%embeddablegroovy-all-1.7.6.jar"
set CODENARC_JAR=../CodeNarc-0.12.jar
set LOG4J_JAR=../lib/log4j-1.2.13.jar
ant -lib %CODENARC_JAR% -lib %GROOVY% -lib %LOG4J_JAR% -lib lib runCodeNarc

ant -libオプションで、GroovyのJarファイル、CodeNarcのjarファイル及びLog4Jのjarファイルを指定している。

編集したbatファイルを実行すると、実行したディレクトリ直下に、「reports」ディレクトリが作成され、「CodeNarcReport.html」が作成される。このファイルをブラウザ等で開くことによって、コマンドラインからの実行と同様に分析結果を参照することが可能である。

まとめ

今回は、静的コード解析ツールのメリットと、Groovy向けの静的コード解析ツールCodeNarcの基本的な操作方法を解説した。CodeNarkの操作方法はそれほど難しくないと感じて頂けたと考えている。

CodeNarkは、静的解析に利用するルールのカスタマイズ機能や各種開発管理ツールと連携する機能を持っている。これらの機能を利用することによってより現実の開発プロセスに静的コード解析を取込みやすくなる。次回以降は、これらの機能を紹介させて頂ければと考えている。

おまけ

jggug合宿で制作したwiki(https://github.com/jggug/simple-wiki)に対して、CodeNarkのbasicルールセットを利用して静的コード分析を行った結果は、以下の通りである。 

CodeNarcで分析した結果は、問題はみつからなかった。ルールセットを変えると問題がみつかる可能性がある。

著者紹介

  • 荒井健太郎
  • 某IT ベンダーのセキュリティコンサルタント、ソフトウエアをよりセキュアにするために日々精進しています。テスト系スクリプトは、G* を利用して書いています。

G*Magazine Vol.1

Grailsをコントロールせよ! Part 1
Griffon 不定期便 〜第2回 バインディング編〜
CodeNarcを利用してGROOVYのコード品質を上げる ~第1回 CodeNarcとは~
GebではじめるWebテスト 〜第1回 導入編〜
Grails Plugin 探訪 第2回 ~Spock プラグイン~
リリース情報 2011.02.11
ぐるーびーたん 第1話