C/C+

C/C++のメモリ破壊を3種の方法で検出してみる

C/C++のプログラマーなら一度は悩ませられるであろうメモリ関連のバグ。その内の1つであるメモリ破壊は作りこむのは簡単ですが、後々見つける事が難しくなる場合も多くやっかいな奴です。

今回はそんなメモリ破壊検出の助けとなるツールをいくつか試してみます。

メモリ破壊を起こすソースコード

まず、メモリ破壊を起こすサンプルとしてバッファオーバーフローを起こすoverflow.cを準備します。

overflow.c

Electric Fenceによる検出

Electric Fenceはmalloc()関数を使用する際にプログラマーがやりがちなバグの検出を手助けするライブラリーです。

通常、malloc()で取得したメモリ領域を超えて不正アクセスを行っても、そこがアクセス可能な領域である場合はプログラムは起動し続けてしまいバグに気づかないことがあります。

Electric Fenceを使用するとそういったケースでも不正メモリアクセスを検出し即時にコアダンプするようになります。

ライブラリーのインストールとコンパイル時に-lefenceを指定することで使用できます。

Valgrindによる検出

Varlgrindはメモリリーク検出やメモリデバッグを行うことができるツールです。解析の速度は低速ですがデバッグ対象のプログラムを再コンパイルしなくても使えるというメリットがあります。

Mudflapによる検出

MudflapはGCC4に実装されているデバッグ機能です。バッファオーバーフローやメモリリークをプログラム実行時に検出することが可能です。

ライブラリーのインストールとコンパイル時に-fmudflap -lmudflapを指定することで使用できます。

まとめ

各ツールの比較

ツール名デバッグ対象の
再コンパイル
実行速度動的メモリの
チェック機能
静的メモリの
チェック機能
分かりやすさ
Electric Fence必要×
Valgrind不要
Mudflap必要

各ツールの使用感を比較するとこんな感じでしょうか。
どれも一長一短あるので状況に応じて使い分けるのが良さそうです。