Mudflapを使う

gcc4から使える機能です。バッファーオーバーフロー検出ツールです。
メモリの割り当てとして、ヒープ領域、bss領域、stack領域などがあります。このツールでは、下記のようなケースが検出されました。

/* test.c */
static char onbss[128];
int main(void)
{
    char onstack[128] = {0};
    int dummy;
    dummy = onbss[128];
    dummy = onstack[128];
    return 0;
}

ビルド方法は下記になります。

gcc -g -fmudflap test.c -lmudflap

実行結果

*******
mudflap violation 1 (check/read): time=1354703106.661039 ptr=0x80c9c80 size=129
pc=0xb76153ff location=`testflap.c:8:18 (main)'
      /lib/libmudflap.so.0(__mf_check+0x3f) [0xb76153ff]
      ./a.out(main+0xa5) [0x8048835]
      /lib/libmudflap.so.0(__wrap_main+0x4b) [0xb7614b4b]
Nearby object 1: checked region begins 0B into and ends 1B after
mudflap object 0x901d1e8: name=`testflap.c:1:13 onbss'
bounds=[0x80c9c80,0x80c9cff] size=128 area=static check=3r/0w liveness=3
alloc time=1354703106.660965 pc=0xb7614adf
number of nearby objects: 1
*******
mudflap violation 2 (check/read): time=1354703106.661411 ptr=0xbf85846c size=129
pc=0xb76153ff location=`testflap.c:9:20 (main)'
      /lib/libmudflap.so.0(__mf_check+0x3f) [0xb76153ff]
      ./a.out(main+0x11a) [0x80488aa]
      /lib/libmudflap.so.0(__wrap_main+0x4b) [0xb7614b4b]
Nearby object 1: checked region begins 0B into and ends 1B after
mudflap object 0x901e790: name=`testflap.c:5:10 (main) onstack'
bounds=[0xbf85846c,0xbf8584eb] size=128 area=stack check=3r/0w liveness=3
alloc time=1354703106.661027 pc=0xb7614adf
number of nearby objects: 1

一応、対応するソースコードの場所が表示されますが読みにくいです。valgrindの方が見やすいですね。ただvalgrindでは、bss領域、stack領域のオーバーフローは検出できないので、その点はすごい。

参考文献
Binary Hacks――ハッカー秘伝のテクニック100選