Seaside Laboratory

Posts

Cppcheck による静的コード解析

C++ は強力なツールではあるが、それ故に危険なコードも簡単に作り出せてしまう。ポインタによるアクセス違反やメモリリークといった、実行時に判明するバグは再現性が乏しく対処が難しい。そこで登場するのが「静的コード解析」といわれるツールで、コンパイル前のソースコードを調べ上げ、危険なコードを炙り出してくれる。

Wikipedia を見る限り、C/C++ 用の静的コード解析ツールは幾つかあるようだが、C にしか対応していなかったり、商用のものを除くと候補はあまり多くない。その中で個人的にオススメなのが Cppcheck。

以前の Cppcheck はソースコードで配布されていたので、導入の際には各自でコンパイルしなければならないという面倒臭さがあったが、最近はコンパイル済みのバイナリも配布するようになったので最新版を導入してみることにした。

インストール

まずは公式サイトから Cppcheck をダウンロードする。解凍するだけで使える簡易的なパッケージを期待していたが、インストーラー強要の msi 形式で配布されていて困ってしまった。ネットで調べてみると msi を展開する方法はいくつかあるらしく、7-Zip がインストール済みだったので、それを使って展開することにした。

msi を展開すると Cppcheck.cab というファイルが出現するので、それをさらに展開する。コード解析には cab に含まれているファイル群されあれば事足りるが、付属の DLL の名前を cppcheckcore.dll から cppcheck-core.dll に変更しておかないと、実行時にリンクエラーが出る。

このインストール方法はちょっと変わったやり方なので、インストーラー経由で構わないという人は普通にインストールして下さい。

使い方

インストールが終わったら、とりあえず以下のコマンドを入れてソースをチェック。

cppcheck.exe --enable=all ソースの入ったディレクトリ

頻繁に実行するのであればバッチファイルにしておいた方が後々楽になる。

cppcheck.exe をフルパスで記述 --enable=all ソースの入ったディレクトリ 2> ログファイル名

診断結果は標準エラーに出力されるので、リダイレクト記号を ">" ではなく "2>" にするのがポイント。

診断ログには、メンバ変数がコンストラクタで初期化されていないことに対する警告や、変数のスコープが無駄に広い、といったバグを未然に防ぐアドバイスが書かれている。Cppcheck の紹介例によく出てくるメモリリーク警告は、ソースにバグがなかったのか、検出が難しかったのか分からないが、まだ遭遇したことがない。