どうやら Javaの場合とちがって、C/C++用のプラグインはコードの解析を他のツールに委譲し、結果の集計と整形を行うだけの機能しか無い様だ。
なので、オフィシャルの情報に従ってツールを入れることにした。
解析ツールは複数の選択肢があるが、最初に示されているのが cppcheckというヤツだ。
ソースコードの中の危ない箇所や怪しい箇所を見つけて指摘してくれる。
インストール
Ubuntu 17.04使ってるので aptで cppcheckを installするだけ。事前に updateしても1分と掛からない。
インストール後の OS再起動も不要。
実行
個別のソースを指定して解析することもできるが、SonarQubeを使うときは対象のディレクトリにあるのを一度にやりたいので --ename=allを指定する。こんな感じだ。
cppcheck --xml-version=2 --enable=all . 2> cppcheck.xml
--xml を指定すると XML形式のレポートが出力される。 --xml-version=2はそのバージョン2ということで、出力される内容が少し詳しくなっている。この例で "." を指定してるのは解析するソースを探すパスで、カレントを指定している。これは絶対パス、相対パスのいづれかを指定すればよい。
標準エラーに出力された内容を cppcheck.xmlファイル(名前は任意で良い)に出力する。
それでは次のコードを解析してみる。(一目見て怪しいコードだと解かるでしょう。チェック対象だから何らかのエラーか警告が欲しいのでわざとやってるのです。普段からこんな危険なコード製品に組み込んだりはしてませんから…)
#include <stdio.h>
static int* getPointer() {
int value;
return &value;
}
int main() {
printf("Hello, world.\n");
int* p = getPointer();
if (*p != 0) {
*p = 2;
}
printf("[INFO] *p(%p): %d\n", p, *p);
return 0;
}
結果は次のとおり、エラーが含まれている。
<?xml version="1.0" encoding="UTF-8"?>
<results version="2">
<cppcheck version="1.76.1"/>
<errors>
<error id="returnAddressOfAutoVariable" severity="error"
msg="Address of an auto-variable returned."
verbose="Address of an auto-variable returned." cwe="562">
<location file="Main.c" line="5"/>
</error>
<error id="missingIncludeSystem" severity="information"
msg="Cppcheck cannot find all the include files (use
--check-config for details)"
verbose="Cppcheck cannot find all the include files. Cppcheck
can check the code without the include files found. But the
results will probably be more accurate if all the include files
are found. Please check your project's include directories
and add all of them as include directories for Cppcheck. To see
what files Cppcheck cannot find use --check-config."/>
</errors>
</results>
このままでも役に立つけど、SonarQubeでより見やすくすることができる。SonarQubeに関する報告は、またの機会とする。実際のプロジェクトで使用するにはコンフィグレーションも必要になるが、Softiesプロジェクトでは少しずつ調整して行くことにする。