Aug 3 2013

Cppcheck でセキュアコーディング 〜 基礎編 〜

Version : Cppcheck 1.6.0.1
medium_4680320507

C++ でソースコードを書いていると、気づかない内にバッファオーバーランの危険性のあるコードや変数の初期化を忘れてバグを産むコードなどを書いてしまっていることがあります。商用のコードの場合には脆弱性の問題や品質問題になりかねません。そのため高価な Fortify などのコード解析ツールを利用して危険性を自動チェックすることが義務付けられている会社も多いと思います。
でもたとえ個人でもコードのチェックをきちんとやることはとても大事です。安全なばかりでなくバグも見つかることがままありますし。
無料の C++ ソースコード解析ツールを探していたところ、Cppcheck が良さげだったのでご紹介します。
まずは基礎編としてインストールと GUI ツールの使い方です。

photo credit: FutUndBeidl and Ra Moyano via photopin cc


Pocket
[`evernote` not found]

 

Cppcheck は Eclipse や Jenkins 用のプラグインが用意されていますが、今回はインストーラと単体 GUI ツールが用意されている Windows 版で説明します。

まずは、Cppcheck のページからインストーラをダウンロードします。緑色の背景で「Download Now!」と書いてあるボタンが Windows 用のインストーラです。

http://cppcheck.sourceforge.net/

Windows 以外の環境や特定の IDE などのプラグインとしてインストールしたい場合には個別のプロジェクトページからダウンロードが必要です。

インストール手順は特に難しいこともなく、C++ でコードを書いている人ならここでつまづくわけがありませんね。

 

コマンドラインからもチェックは可能ですが、せっかく GUI ツールが付いているのでそちらを使ってみます。

[プログラム] – [Cppcheck 1.6.0.1] – [Cppcheck] からアプリを起動します。表示されたウィンドウのファイルメニューの下にある C++ アイコンをクリックするとフォルダの下にある *.cpp ファイルをいっぺんにチェックしてくれます。

スクリーンショット_080313_081333_PM

チェックが終わると、問題があった箇所を列挙してくれます。リストから個別の問題を選択すると、下のペインには指摘内容の詳細が表示されます。メッセージが英語なのがオエッって感じかもしれませんが、C++ でコーディングをしている人ならピンとくるレベルかと思います。

スクリーンショット_080313_082555_PM

 

デフォルトではエラー、警告、スタイル警告、移植性、パフォーマンス、情報の6種類のカテゴリーがすべて表示されるようになっていますが、プログラムの安全性のチェックという目的だけであれば、エラーと警告のみのチェックに絞っても構わないと思います。チェックが早くなりますしリストも見やすくなります。僕はコンパイル時の Warning も全部消したい人なので全チェックしてもひとつも指摘が出ないようにしたいですが (^_^;)

 

各行をダブルクリックするとソースコードを開いてくれるのですが、デフォルトではメモ帳が開きます。メモ帳だとファイルは開きますが、指摘のあった行には自動的に飛んでくれません。

外部のエディタを使って指摘のあった行にジャンプするには設定が必要です。[編集]-[設定]から設定メニューを開き、そのダイアログの中の[アプリケーション]タブを選択します。僕は Sublime Text  2 を使っているのでその設定を行います。

スクリーンショット_080313_084710_PM

ポイントはコマンドラインに渡すパラメータでしょう。起動時の引数としてエディタに渡されます。ファイル名と指定の行を引数で受け取れるエディタであれば、(file) と (line) を書くことで起動時にファイル名と行数に置換されてエディタが呼び出されます。

Sublime Text 2 は ファイル名:行番号 という引数を渡すことで指定のファイルの指定の行を開くことができるので (file):(line) と書きます。

設定を終えたら「デフォルトとして設定」ボタンを押してデフォルトエディタにしておきましょう。さもないと、またメモ帳が開いてしまいます。さて、ダブルクリックしてみましょう…

スクリーンショット_080313_085531_PM

うまくいきました!

秀丸エディタの起動オプションによると、 /j オプションで目的の行に飛ぶようです。またファイル名の前にオプションを付けなくてはならないようですので、次のようにすればよいと思います。

/j(line) (file)

※(line) と (file) の間は空白が入っています。

 

次回は応用編として Visual Studio との統合方法をご紹介します。

 

Pocket
[`evernote` not found]

コメントを残す