ソースコードの静的解析ツール CppCheck と Jenkinsプラグイン

更新日:

CppCheckとは、C/C++で組まれたプログラムコードを静的に解析し、
NULLポインタチェックもれ」や、「配列外参照」、などをチェックする事ができます。
 
今回はUIを使用した単体での説明は省きます。
Jenkinsでの使用を想定し、各種コマンドラインの説明を行います。
 

CppCheckをインストールする

まずはCppCheckをダウンロードしましょう。

Cppcheck
http://cppcheck.sourceforge.net/

今回の説明では、Version 1.61 を使用します。インストールが済んだら、
コマンドプロンプトでCppCheckのインストールディレクトリに移動しましょう。
cppCheck.exe があるので実行してみましょう

C:\CppCheck>cppCheck.exe

ヘルプがでてくるので困ったらそこから確認を。

cppcheck_000
 

コマンドラインから解析を行う

ソースコードを解析する為の最低限の引数は以下です。

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
 
 

-その他
-, ,

Copyright© 打ち聞かせ , 2021 All Rights Reserved Powered by STINGER.