02 Mar 2013, 07:25

CppcheckをEclipse CDTに組み込んで静的解析!C/C++ユーザに嬉しい『cppcheclipse』

Eclipse CDT からCppcheckの結果が見れたら便利だなーなんて思って、Eclipseのプラグインを探してみたら、こんなのを見つけた。

cppcheclipse – Integration for cppcheck with Eclipse (CDT) – Google Project Hosting

なんと語呂がいい名前。座布団一枚だ。 というわけで、試してみる。

環境

  • Eclipse 4.2 Juno
  • Windows 7
  • Cppcheck 1.58(注:1.58でないと、Eclipse 4.2 Junoで動かなかった」

cppcheclipseのダウンロードとインストール

Eclipse CDTとCppcheckはインストールされていることが前提で。
Cppcheckがインストール方法は過去記事を参照ください。

CppCheckでC言語/C++のメモリリーク(解放漏れ)を静的解析で検出する。 | Futurismo

注:cygwinからのcppcheckでは動かないので注意すること。

cppcheclipseのインストールは、ツールバーから[ヘルプ] > [Eclipse マーケットプレイス]を選択して、cppcheckで検索すると見つかるので、インストールを選択。

image

Eclipseでの設定

インストールして再起動したら、ツールバーの[ウィンドウ] > [設定] > [C/C++]を選択する。選択項目にcppcheclipseが現れる。

まず、Cppcheckの実行バイナリを選択する。

image

次に、[設定]を選択して、cppcheck実行時のオプションを選択する。
とりあえずは、”–enable=all”だけでよい。

130302_1.png

 

cppcheckを実行する

プロジェクト・エクスプローラからcppcheckを実行したいファイルやフォルダを選択して、右クリック。[cppcheck] > [run cppcheck]を選択して、実行。

実行の結果、エラーがあった場合は[問題ビュー]から確認できる。
そのまま、該当箇所にもジャンブで移動可能なのが嬉しい。

エディタにも、エラー箇所は赤く表示される。

130302_2.png

 

[Ctrl + Alt + C]がCppcheckの実行に割り当てられている。
これで、アクティブなファイルに対して即座に静的解析が実行できる。とても便利だ。

cygwinにインストールしたcppcheckは使えない

cygwinにインストールしたcppcheckだと、cppcheckの結果を正しくEclipseがパースしてくれない。templateの指定方法が間違ってるようで、”問題”ビューにあらわれてくれない。
下のような感じで、表示されてしまう。

‘{file}:{line},{severity},{id},{message}’

WindowsにインストールしたCppcheckを使うこと。

03 Oct 2012, 12:15

地獄の苦しみ、メモリ破壊をCppcheckで華麗に食い止めよう!

前回の記事の続き。

CppCheckでC言語/C++のメモリリーク(解放漏れ)を静的解析で検出する

Cppcheckを利用して、バッファオーバーランを検出したい。

バッファオーバーランとは、バッファオーバーフロー、メモリ破壊、メモリ不正番地アクセスとも言われていて、組込みエンジニアを一瞬のうちに恐怖に戦かせる魔法のぽぽぽぽーんだ。

いろんなパターンのメモリ破壊をCppCheckで検出できるか、遊んでみた。

メモリ解放したあとにアクセスしてしまうパターン

[c]

void buffer_over_run(void)

{

char *p;

p = (char *)malloc(1);

free(p);

*p = 3;

}

[/c]

[text]

$ cppcheck –enable=all memory_leak.c

Checking memory_leak.c…

[memory_leak.c:21]: (error) Dereferencing ‘p’ after it is deallocated / released

[memory_leak.c:21]: (error) Uninitialized variable: p

Checking usage of global functions..

[/text]

関係ないメモリ領域に勝手にデータを書き込んでしまう領域破壊パターン

[c]

void buffer_over_run(void)

{

char *p;

p = (char *)malloc(1);

memset(p,”c”,2);

free(p);

}

[/c]

[text]

$ cppcheck –enable=all memory_leak.c

Checking memory_leak.c…

[memory_leak.c:11]: (error) Buffer is accessed out of bounds.

Checking usage of global functions..

[/text]

配列で宣言した領域をオーバーするパターン

[c]

void buffer_over_run(void)

{

char c[5];

c[5] = 3;

}

[/c]

[text]

$ cppcheck –enable=all memory_leak.c

Checking memory_leak.c…

[memory_leak.c:8]: (style) Variable ‘c’ is assigned a value that is never used

[memory_leak.c:21]: (error) Array ‘c[5]’ accessed at index 5, which is out of bounds.

Checking usage of global functions..

[/text]

インクリメントすることで、知らないうちに不正番地アクセス

[c]

void buffer_over_run(void)

{

char *p;

p = (char *)malloc(1);

p++;

*p = 1;

printf(“%x”,p);

free(p);

}

[/c]

[text]

$ cppcheck –enable=all memory_leak.c

Checking memory_leak.c…

Checking usage of global functions..

[/text]

あれ、検出してくれない・・・・そして

$ ./a.exe
*p = 800482a8
Aborted (コアダンプ)

ちょ・・・・なんとかしてよ。

おまけ

ネットを徘徊していたら、メモリ破壊についての面白い詩をみつけた。

直接引用はチョッと気が引けるので、参考リンクとしてリンク貼っておく。

諸君、私はC言語が好きだ

02 Oct 2012, 23:35

CppCheckでC言語/C++のメモリリーク(解放漏れ)を静的解析で検出する。

メモリ解放漏れ・メモリ二重解放は組込みエンジニアにとって、背筋が凍る単語だ。

それは、即、残業しなさいという意味に転じる。

そこから、泥沼のデバッグにハマることがよくある。

そんな課題をスマートに解決するために、メモリ解放漏れやメモリ二重解放を検出するツール調べてみたので、メモメモ。

オープンソース CppCheckのインストールをしよう

Cppcheckを使うことでメモリ解放漏れを静的解析で見つけることが可能だ。CppCheckはその他にも、アロケーション(確保と解放)の不一致(メモリ二重解放),バッファオーバーランの検出ができる。OSSなので、誰でも無料で利用可能。

CppCheckのダウンロードはココから

Cppcheckの使い方の日本語訳は、以下のサイトで公開されている。

(ものすごく感謝!)今回はこれを参考に自分でも試してみる。

cppcheck 日本語マニュアル – 一人ぼっちの共鳴

cppcheck 英語マニュアルはこちちから

Cppcheckでメモリリークを検出する

Cppcheckを利用するには、–enable=allオプションをつけて以下のコマンド実行。

[text]

cppcheck –enable=all [フアイル名]

[/text]

試しにこんなコードを書いてみた。

memory_leak.c

[c]

#include

#include

int main(void)

{

int *p = NULL;

printf(“*p = %x\n”,p);

p = malloc(10);

printf(“*p = %x\n”,p);

return 0;

}

[/c]

なかなか、喧嘩を売っているコードだけれども、

これをCppCheckでチェックすると、案の定怒られる。(よしよし (^-^))

[text]

$ cppcheck –enable=all memory_leak.c

Checking memory_leak.c…

[memory_leak.c:12]: (error) Memory leak: p

Checking usage of global functions..

[/text]

自分で定義したメモリ獲得/解放関数のメモリリークをチェックする

次に、ユーザ定義したメモリ獲得/解放関数をチェックする。

普通、C標準のメモリ獲得/解放関数を直接使用することはなく、自前の関数でカスタマイズして使用することが多い。メモリアロケート関数を別ファイルで宣言してみる。

hoge_memory.c

[c]

#include “hoge_memory.h”

void *hoge_malloc(void)

{

return malloc(10);

}

memory_leak.c

void hoge_free(void *p)

{

free(p);

}

#include

#include “hoge_memory.h”

int main(void)

{

char *p = NULL;

printf(“*p = %x\n”,p);

p = (char *)hoge_malloc();

printf(“*p = %x\n”,p);

return 0;

}

[/c]

[text]

$ cppcheck –enable=all memory_leak.c hoge_memory.c

Checking hoge_memory.c…

12 files checked 40% done

Checking memory_leak.c…

22 files checked 100% done

Checking usage of global functions..

[/text]

Oh! 検出してくれないYo!!(゜д゜)/

こんなときは、–appendオプションを使用する。

使い方は、

[text]

cppcheck 窶錀-append=<メモリ獲得・解放関数定義file> <静的解析対象file>

[/text]

[text]

$ cppcheck –enable=all –append=hoge_memory.c memory_leak.c

Checking memory_leak.c…

[memory_leak.c:13]: (error) Memory leak: p

Checking usage of global functions..

[/text]

これで、、メモリリークを検出しました。

メモリ二重解放を検出する

おまけ。メモリ二重解放もこのとおり発見できます!スゲー。

[c]

int main(void)

{

char *p = NULL;

printf(“*p = %x\n”,p);

p = (char *)hoge_malloc();

printf(“*p = %x\n”,p);

hoge_free(p);

hoge_free(p);

return 0;

}

[/c]

[text]

$ cppcheck –append=hoge_memory.c memory_leak.c

Checking memory_leak.c…

[memory_leak.c:15]: (error) Deallocating a deallocated pointer: p

[/text]

使われていない関数宣言

[text]

$ cppcheck –append=hoge_memory.c –enable=all memory_leak.c

Checking memory_leak.c…

Checking usage of global functions..

[memory_leak.c:18]: (style) The function ‘hogehoge_special’ is never used

[/text]

23 Sep 2012, 09:14

CCCCを利用してC言語のステップ数をJenkinsで表示する

CCCCとは、C言語/C++のステップカウンタだ。
ステップ数をカウントをカウントしてくれるだけでなく、
コードの様々なメトリックをレポートととして生成してくれる。

CCCCとは、ギャグでもなんでもなく、C and C++ Code Counterの略。
以下からダウンロードできる。

C and C++ Code Counter 窶錀 sourceforge

ccccを実行して、ステップ数を得る

ccccはコマンドラインから以下のように実行する。

cccc (対象ファイル)

すると、.ccccというディレクトリに cccc.htmlやらcccc.xmlやらが自動で生成される。

cccc.hemlはこんな感じで出力される。LOCというのが行数にあたる。

image

CCCCはWindows版では
C:\Program Files (x86)\CCCC\cccc.exe
にインストールされるので、Windowsのコマンドプロンプトから実行するには、
直接バスを指定するか、環境変数を設定するかの工夫が必要。

CCCC Pluginを導入してJenkinsで表示する

CCCC PluginをJenkinsにインストールする。
[Jenkinsの管理] > [プラグインの管理] からCCCC Pluginを選択して、インストール。

カバレッジ出力するための設定は、[設定] > [ビルド] で、ccccのコマンドを追加する。

[ビルド後の処理] に [Publish CCCC report]
という項目が追加されているので、選択。 xmlファイルパスを追加する

image

出力結果

出力結果は .htmlと同じだけれど、
ソースが参照できなかったり、関数ごとのステップ数がわからなかったりする。
あまり・・・・な感じだ。

image

こんな感じで、ステップ数の遷移もワカルようだ。(あまり例がよくないな・・・)

image

参考リンク

23 Sep 2012, 05:37

Cppcheckで静的解析して、Jenkinsで表示してみる。

C/C++用の静的解析ツール、cppcheckを使って、静的コード解析をして、

解析結果をJenkinsで表示する方法を調べてみた。

CppCheckのダウンロード・インストール

以下の公式サイトから入手する。

http://cppcheck.sourceforge.net/

Cygwiinからでも入手ができた。

Cygwin使いの自分は、cygwin の setup経由で入手。

image

CppCheckを実行してみる

公式マニュアルはココ( var 1.56)

コマンドラインから、以下のコマンドを実行する。

[text](フアイル単位)

cppcheck –enable=all hogehoge.c

[/text]

[text](フォルダ単位)

cppcheck –enable=all hogehoge

[/text]

[text]

ex.)

C:\mock_study>cppcheck –enable=all src

Checking src/numlib.c…

12 files checked 22% done

Checking src/sample.c…

22 files checked 100% done

Checking usage of global functions..[/text]

XML形式で結果を出力するには、窶肺ml オプションをつける。

( –xmlツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ Write results in xml format to error stream (stderr).)

これで、標準エラーでXML形式の結果が出力されるので、

リダイレクトでファイルに記録すればよい。

[text]C:\mock_study>cppcheck –enable=all 窶度ml srcツꀀ 2>cppcheck_result.xml[/text]

( 2> で標準エラーをリダイレクトできるんですねー、知らなんだ ; ~_ ~ ; )

CppCheck Plugin を Jenkinsに入れて、静的コード解析結果をみる

Cppcheck PluginをJenkinsにインストールする。
[Jenkinsの管理] > [プラグインの管理] から Cppcheck Pluginを選択して、インストール。

プロジェクトの[設定] > [ビルド] で、cppcheckのコマンドを追加する。

[ビルド後の処理] に [Publish Cppcheck results]

という項目が追加されているので、選択。

Cppcheck report XMLsという項目に、xmlファイル名を追加する。image

実行結果

Web画面でエラーが確認できる。

クリックすれば、ソースの該当箇所まで飛んでくれる。便利。

image

動作環境

  • Windows 7
  • Cppcheck 1.56
  • Cppcheck Plugin 1.11

参考ページ