9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CppCheckをgit pre-commitで使ってみた

Last updated at Posted at 2017-12-12

グレンジ 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

試したコード

main.cpp
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を実際のプロジェクトではまだ使っていないので、個人でとりあえず試してみようと思います。

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?