「グレンジ Advent Calendar 2017」13日目を担当の"ito_shin_2017"です
##cppcheckとは
C/C++用の静的解析ツールです。メモリリーク、アロケーション(確保と解放)のミスマッチ、バッファオーバーラン、さらに多くのチェックを行います。目標は、0%の誤認識としています。
ここから引用
cppcheck(公式)
http://cppcheck.sourceforge.net/
cppcheckのプラグインなど一覧(公式サイトから引用)
Clients and plugins
Cppcheck is integrated with many popular development tools. For instance:
CLion - Cppcheck plugin
Code::Blocks - integrated
CodeDX (software assurance tool) - integrated
CodeLite - integrated
CppDepend 5 - integrated
Eclipse - Cppcheclipse
KDevelop - integrated since v5.1
gedit - gedit plugin
Hudson - Cppcheck Plugin
Jenkins - Cppcheck Plugin
Mercurial (Linux) - pre-commit hook - Check for new errors on commit (requires interactive terminal)
Tortoise SVN - Adding a pre-commit hook script
Git (Linux) - pre-commit hook - Check for errors in files going into commit (requires interactive terminal)
Visual Studio - Visual Studio plugin
QtCreator - Qt Project Tool (qpt)
"Git (Linux) - pre-commit hook - Check for errors in files"が便利そうなので試しに使ってみる
(git pre-commitの説明はコチラ)
コマンドインストール
brew install cppcheck
ファイルを設置
↑のファイルをpre-commitにリネームして
".git/hooks/"に設置(※実行権限付与してください)
指摘してくれる項目の重要度タイプについて
"cppcheck --errorlist"でそれぞれの指摘内容の重要度タイプ(SeverityType)が確認できます
今回のpre-commitのケースでは、errorにあたるものが含まれている場合だけcommitが弾かれるようにはなっています
・error
メモリリークなどの重大で、確実なエラーを示します
例)明らかな配列外参照
・warning
深刻なランタイムエラーを引き起こす危険なコーディングスタイルに使用されます
コンストラクタでメンバ変数の初期化忘れなど
・style
一般的なコードクリーンアップの推奨事項に使用されます。これらを修正してもバグは修正されませんが、コードの保守が容易になります。たとえば、冗長コード、到達不能コードなど
・performance
エラーではありませんが、修正すると、コードのパフォーマンスが向上するかも
・portability
異なるプラットフォームとビット数(32/64ビット)でコードが適切に移植できないことを示しています。コードが異なるプラットフォームとビット数でコンパイルされる場合、これらの警告は修正する必要があります
・information
コードに対するエラーなどではなく、cppcheck実行に関する情報。インクルードファイルをcppcheckが見つけられない場合など
おすすめカスタマイズ
デフォルトのままだと重要度タイプがerrorのものしか教えてくれないので、pre-commitでcppcheckコマンドを実行する際のオプションに"--enable=all"を追加することをおすすめします。これで、使用されていない変数があった場合などの警告などもcommit時にしてくれます。
cppcheck --error-exitcode=1 $changed_files
試したコード
void hoge() {
return;
}
int main() {
int a[1];
a[2] = 3;
return 0;
}
これをcommitしようとすると・・・
Checking main.cpp ...
[main.cpp:7]: (error) Array 'a[1]' accessed at index 2, which is out of bounds.
[main.cpp:7]: (style) Variable 'a' is assigned a value that is never used.
[main.cpp:1]: (style) The function 'hoge' is never used.
と表示がされ、errorが含まれている場合はcommitが弾かれるようになります
実際にチェックしてくれる項目は"cppcheck --doc"で確認することが出来ます
さいごに
読んでくださった方ありがとうございます。
cppcheckを実際のプロジェクトではまだ使っていないので、個人でとりあえず試してみようと思います。