CppCheckとは、C/C++で組まれたプログラムコードを静的に解析し、
「NULLポインタチェックもれ」や、「配列外参照」、などをチェックする事ができます。
今回はUIを使用した単体での説明は省きます。
Jenkinsでの使用を想定し、各種コマンドラインの説明を行います。
CppCheckをインストールする
まずはCppCheckをダウンロードしましょう。
Cppcheck
http://cppcheck.sourceforge.net/
今回の説明では、Version 1.61 を使用します。インストールが済んだら、
コマンドプロンプトでCppCheckのインストールディレクトリに移動しましょう。
cppCheck.exe があるので実行してみましょう
C:\CppCheck>cppCheck.exe
ヘルプがでてくるので困ったらそこから確認を。
コマンドラインから解析を行う
ソースコードを解析する為の最低限の引数は以下です。
cppCheck.exe --enable=all [files/folder]
cppCheck.exe --enable=all D:\testProject\test.cpp
cppCheck.exe --enable=all D:\testProject\
「--enable=all」は、何をチェックするかの指定方法です。
「all」以外が存在しますが基本これで問題ありません。必要があればマニュアルを。
結果をファイルに出力したければ、コマンドプロンプトでは当たり前のリダイレクトですね。
cppCheck.exe --enable=all D:\testProject\ > cppcheck_result.txt
オプションを指定して効率よく解析を行う
オプションを指定する事で、特定のファイル・エラーを除外したり、
チェックを高速にしたりする事が可能です。
チェックに使用するdefineを切り替える
チェックはdefineの組み合わせで行われたりします。
絶対使うものや絶対使用しない物を指定する事で、正しく高速にチェックされます。
-D 解析に使用するdefineを指定 -U 解析に使用しないdefineを指定
#define TEST_ARRAY_NUM (2) class Test{ private: int m_array[TEST_ARRAY_NUM]; };
たとえばこんな場合は、「TEST_ARRAY_NUM」は絶対使用します。そのため、
-DTEST_ARRAY_NUM
と指定する事で強制できます。複数指定したい場合は、「-D」を複数指定すればOKです。
-D**** -D**** -D*****
1.61より前のバージョンでは、-U は単体での未使用指定が可能でしたが、
-D はそうではありませんでした。一つ指定したらなんだか思ったようにチェックしてくれなくて・・・。
1.61からは大丈夫そうなのでこれでやっと使える!!!
チェック組み合わせ数の変更
あまりにもdefineの定義が多いファイルの場合、チェックが行われません。
そんなときは、数を増やすか、全部やっちゃって!と指定すればOKです。
--max-configs=[num] チェック数を指定する。初期値は12 --force チェック指定を無視して全部チェック
--max-configs=15
--force
特定のエラーを無視する
--suppress=[error id] 指定したエラーを無視する --suppress=[error id]:[filename] 特定のファイルから指定したエラーを無視する --suppress=[error id]:[filename]:[line] 特定のファイルから指定した行にある指定エラーを無視する
ファイル名の指定には、ワイルドカードが指定可能ですので、
結構いろいろかけると思います。
エラー無視に関しては、テキストファイルも指定できます。
その中に、一行ずつ無視するエラーを定義します。空白行も可能です。
--suppressions_list=[filename] 指定したエラーを無視する
--suppressions_list=suppressions_list.txt
suppressions_list.txt の中身
syntaxError noConstructor uninitVar:library/*
特定のディレクトリ・ファイルをチェックから除外する
-i [dir/file] チェックから除外する
dir指定の場合最後のスラッシュを忘れずに
-i test/
複数指定したい場合は、「-i」を複数指定すればOKです。
-i test/ -i debug/test/
インクルードディレクトリを指定する
ディレクトリでチェックした場合にその中にファイルがあればいいですが、
無い場合は、インクルードディレクトリを指定する必要があります。
-I [dir] インクルードディレクトリを追加する
複数指定したい場合は、「-I」を複数指定すればOKです。
処理時間を高速にする為のマルチスレッド処理指定
-j [num] スレッド数を指定してマルチスレッド化
高速化できますが、ひとつだけ注意があります。未使用関数のチェックができなくなります。
チェックしたい場合は、オプション無しで実行する必要があります。
結果をXMLで出力する
--xml 結果をXMLで出力
ただし、プロンプトの出力結果がXML形式になるだけですので、
合わせてリダイレクトします。
cppCheck.exe --enable=all --xml D:\testProject\ 2> cppcheck_result.xml
このオプションは、Jenkinsと連携する際に使用します。
Jenkinsでは、XMLで出力し、プラグインにそのXMLを渡すという流れです。
Jenkinsと連携する
プラグインの追加で CppCheck と入力すれば、出てくると思います。
それを追加して下さい。
後は、CppCheckを実行するジョブの「ビルド後」にプラグインを指定、設定するだけです。
それと除外ディレクトリ、ファイルの指定がうまくいかなければ、
チェックコマンドの前に、物理的に削除するといいと思います。
説明が簡単すぎるって?結構長くなって疲れてしまいました。
難しい作業ではないのでこれくらいでw