Aug 5 2013

Cppcheck でセキュアコーディング 〜 応用編 〜

Version : Cppcheck 1.6.0.1
medium_4680320507

前回に引き続き、今回も Cppcheck を使ったセキュアコーディングについてです。Visual Studio の開発環境と統合して利用する方法について調べたのでまとめてみました。外部ツールとして登録することで簡単にチェックができるようになります。また、マクロを利用することでソースコードの保存時に自動的にチェックを走らせる方法をご紹介します。

photo credit: FutUndBeidl and Ra Moyano via photopin cc


Pocket

Visual Studio 2008 Professional を例に Cppcheck を統合する方法をご紹介します。2008 とはずいぶん古いな…と言われそうですが、毎回新しい開発環境を導入するわけにもいかず。ご了承くださいません。基本的には 2010, 2012, はたまた 2005 や 2003 でも同じ(ハズ)です。

Visual Studio の [ツール] – [外部ツール…] を選択します。

Windows_8_Pro

追加ボタンを押して、 新規に外部ツールの登録を行います。ここでは次のように設定しました。

引数の enable=all はすべてのカテゴリのエラーをチェックするオプション、quiet は余分な情報を出さずに問題があった行と内容だけを出力するモード、template=vs は Visual Studio 用の出力テンプレートを利用するという意味です。最後の $(ItemPath) は解析対象のファイルパスが入ります。

また、忘れずに「出力ウィンドウを使用」にチェックを入れておきます

Windows_8_Pro_3

この後説明するマクロとの統合のために、今回登録した外部ツールをリストの先頭に持ってきておいてください。ただし、マクロ機能は Express エディションにはついていないので、Visual Studio Express を使っている場合にはリストの位置は気にする必要がないです。

Windows_8_Pro 4

さっそく使ってみましょう。Visual Studio を起動して何かプロジェクトを開いてください。次に、チェックしたいソースコードをエディタ画面上に出した状態で [ツール] メニューを開きます。先ほど追加した Cppcheck があると思うのでそれを選びます。

Windows_8_Pro 5

すると、現在開いている cpp ファイルに対して Cppcheck が走ります。問題があると下記のように、その行番号と内容が表示されます。通常のコンパイルエラーの時と同様にメッセージをダブルクリックするとそのファイルのその行にジャンプします。

Windows_8_Pro 10

 

場合によっては下記のようなエラーが表示されるかもしれません。

Windows_8_Pro 6

これは、インクルードファイルが見つからないという理由でチェックを中断したことを表します。エラーメッセージにあるように、引数に –check-config オプションを付けて再度チェックを行うことで、具体的に見つからなかったインクルードファイルに関する表示が出力されます。

Windows_8_Pro-2

この例では開発環境に含まれているインクルードファイルのようです。明示的にインクルードファイルを指定するには -I オプションを使います。

この例は僕の環境&僕のプログラムの場合ですので、必ずこうすればよいというわけではありません。

でも、これだとプロジェクトごとにインクルードの設定を変えなくてはならないのに、外部ツールの設定は Visual Studio 全体の設定なのでしっくりこないです。それに、芋づる式にインクルードファイルが見つからないというエラーも出ることが多いので、別な方法を考えてみます。

厳密なチェックに支障が出る可能性もありますが、重要度の高いエラーだけチェックをするのであれば enable=all をやめて、インクルードファイルやインフォメーションカテゴリのエラーチェックを抑制してあげればよさそうです。

とすることで、エラー、警告、スタイル、パフォーマンスのカテゴリチェックだけに絞られるので、インクルードファイルの解決ができなくても中断しなくなります。ただ、インクルードファイルで定義されているクラスや型が不明な状態でチェックが走るので厳密なチェックができなくなる可能性はありそうです。

 

大きなプロジェクトになるとファイルがたくさんになるので、個々のファイルを個別にチェックするのは面倒です。外部ツールに別のパターンで Cppcheck を登録しましょう。

Windows_8_Pro 7

先ほどと同様に「出力ウィンドウを使用」にチェックを入れるのを忘れずに!

設定の違いは一箇所だけで、引数の最後を $(ItemPath) から $(ItemDir) にしただけです。[ツール] メニューに「Cppcheck All」項目が追加されるので実行するとフォルダ以下のファイルを次々とチェックしてくれます。

Windows_8_Pro 3

 

最後にマクロ機能を利用して、ファイル保存時に自動的にチェックするようにしてみます。ただし、この機能は Visual Studio Express には付いていませんのでご注意を。

設定方法に関しては下記のサイトを参考にさせて頂きました。
http://www.codeproject.com/Tips/472065/Poor-Man-s-Visual-Studio-Cppcheck-Integration

 

[ツール] – [マクロ] – [マクロ IDE…] を開きます。

Windows_8_Pro 8

 

プロジェクトエクスプローラーの [EnvironmentEvents] をダブルクリックしてマクロを開きます。そして、その中の

Public Module Environment Events に下図の四角で囲ったコードを挿入します。挿入する位置に気をつけてください。

Windows_8_Pro 9

挿入したコードは下記の通り。

マクロウィンドウを閉じて、何か cpp ファイルを保存してみてください。自動的に Cppcheck がそのファイルに対して実行されるようになります。

上記のコードの3行目の “Tools.ExternalCommand1” がミソで、外部ツールとして Cppcheck を登録したときにリストの先頭に持ってきたのはこことの対応をとるためです。リストの2番めにあれば “Tools.ExternalCommand2” とします。

 

最初からコードチェックの機能が付いているみたいですね、、、そちらの方がよいかもしれませんがまだ使ったことがないので試してから機会あればレポートします。

 

 

Pocket

コメントを残す