Cppcheck でセキュアコーディング 〜 応用編 〜
Visual Studio 2008 Professional を例に Cppcheck を統合する方法をご紹介します。2008 とはずいぶん古いな…と言われそうですが、毎回新しい開発環境を導入するわけにもいかず。ご了承くださいません。基本的には 2010, 2012, はたまた 2005 や 2003 でも同じ(ハズ)です。
外部ツールとして登録
Visual Studio の [ツール] – [外部ツール…] を選択します。
追加ボタンを押して、 新規に外部ツールの登録を行います。ここでは次のように設定しました。
1 2 3 4 |
タイトル:Cppcheck コマンド:C:\Program Files\Cppcheck\cppcheck.exe 引数:--enable=all --quiet --template=vs $(ItemPath) 初期ディレクトリ:$(ItemDir) |
引数の enable=all はすべてのカテゴリのエラーをチェックするオプション、quiet は余分な情報を出さずに問題があった行と内容だけを出力するモード、template=vs は Visual Studio 用の出力テンプレートを利用するという意味です。最後の $(ItemPath) は解析対象のファイルパスが入ります。
また、忘れずに「出力ウィンドウを使用」にチェックを入れておきます。
この後説明するマクロとの統合のために、今回登録した外部ツールをリストの先頭に持ってきておいてください。ただし、マクロ機能は Express エディションにはついていないので、Visual Studio Express を使っている場合にはリストの位置は気にする必要がないです。
使ってみる
さっそく使ってみましょう。Visual Studio を起動して何かプロジェクトを開いてください。次に、チェックしたいソースコードをエディタ画面上に出した状態で [ツール] メニューを開きます。先ほど追加した Cppcheck があると思うのでそれを選びます。
すると、現在開いている cpp ファイルに対して Cppcheck が走ります。問題があると下記のように、その行番号と内容が表示されます。通常のコンパイルエラーの時と同様にメッセージをダブルクリックするとそのファイルのその行にジャンプします。
Cannot find all the include files について
場合によっては下記のようなエラーが表示されるかもしれません。
これは、インクルードファイルが見つからないという理由でチェックを中断したことを表します。エラーメッセージにあるように、引数に –check-config オプションを付けて再度チェックを行うことで、具体的に見つからなかったインクルードファイルに関する表示が出力されます。
この例では開発環境に含まれているインクルードファイルのようです。明示的にインクルードファイルを指定するには -I オプションを使います。
1 2 3 4 5 |
--enable=all -I "C:\Program Files\Microsoft Visual Studio 9.0\VC\include" -I "C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include" -I "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include" --quiet --template=vs $(ItemPath) |
この例は僕の環境&僕のプログラムの場合ですので、必ずこうすればよいというわけではありません。
でも、これだとプロジェクトごとにインクルードの設定を変えなくてはならないのに、外部ツールの設定は Visual Studio 全体の設定なのでしっくりこないです。それに、芋づる式にインクルードファイルが見つからないというエラーも出ることが多いので、別な方法を考えてみます。
enable オプションを変える
厳密なチェックに支障が出る可能性もありますが、重要度の高いエラーだけチェックをするのであれば enable=all をやめて、インクルードファイルやインフォメーションカテゴリのエラーチェックを抑制してあげればよさそうです。
1 |
--enable=warning,style,performance --quiet --template=vs $(ItemPath) |
とすることで、エラー、警告、スタイル、パフォーマンスのカテゴリチェックだけに絞られるので、インクルードファイルの解決ができなくても中断しなくなります。ただ、インクルードファイルで定義されているクラスや型が不明な状態でチェックが走るので厳密なチェックができなくなる可能性はありそうです。
プロジェクト全体をチェックする
大きなプロジェクトになるとファイルがたくさんになるので、個々のファイルを個別にチェックするのは面倒です。外部ツールに別のパターンで Cppcheck を登録しましょう。
1 2 3 4 |
タイトル:Cppcheck All コマンド:C:\Program Files\Cppcheck\cppcheck.exe 引数:--enable=warning,style,performance --quiet --template=vs $(ItemDir) 初期ディレクトリ:$(ItemDir) |
先ほどと同様に「出力ウィンドウを使用」にチェックを入れるのを忘れずに!
設定の違いは一箇所だけで、引数の最後を $(ItemPath) から $(ItemDir) にしただけです。[ツール] メニューに「Cppcheck All」項目が追加されるので実行するとフォルダ以下のファイルを次々とチェックしてくれます。
ファイル保存時に自動チェックする
最後にマクロ機能を利用して、ファイル保存時に自動的にチェックするようにしてみます。ただし、この機能は Visual Studio Express には付いていませんのでご注意を。
設定方法に関しては下記のサイトを参考にさせて頂きました。
[ツール] – [マクロ] – [マクロ IDE…] を開きます。
プロジェクトエクスプローラーの [EnvironmentEvents] をダブルクリックしてマクロを開きます。そして、その中の
Public Module Environment Events に下図の四角で囲ったコードを挿入します。挿入する位置に気をつけてください。
挿入したコードは下記の通り。
1 2 3 4 5 6 |
Private Sub DocumentEvents_DocumentSaved(ByVal Document As EnvDTE.Document) Handles DocumentEvents.DocumentSaved If Document.Language = "C/C++" Then DTE.ExecuteCommand("Tools.ExternalCommand1") Document.Activate() End If End Sub |
マクロウィンドウを閉じて、何か cpp ファイルを保存してみてください。自動的に Cppcheck がそのファイルに対して実行されるようになります。
上記のコードの3行目の “Tools.ExternalCommand1” がミソで、外部ツールとして Cppcheck を登録したときにリストの先頭に持ってきたのはこことの対応をとるためです。リストの2番めにあれば “Tools.ExternalCommand2” とします。
実は Visual Studio 2012 では…
最初からコードチェックの機能が付いているみたいですね、、、そちらの方がよいかもしれませんがまだ使ったことがないので試してから機会あればレポートします。