toge's diary

コンピュータ関連の趣味をつらつらと。

mudflapはヘボプログラマを救います!(mudflap再評価)

以前(id:toge:20050410)にmudflapが中途半端にしか使えないように書きましたが、大嘘でした。
mudflapの機能を本当に有効にするためには-lmudflapでライブラリをリンクするだけでなく、オブジェクトファイルの生成時に-fmudflapが必要でした。
こうすることでスタック上だろうがヒープ上だろうが、ばしばし問題点を行数付きで報告してくれます。


例えば以下のコードを対象にします。(ファイル名はtestmudflap.cpp)

7: int a[NUMBER - 10];
8:
9: for (int i = 0; i < NUMBER; i++)
10: {
11: a[i] = i * i;
12: }

んで、以下のようにしてコンパイルします。

g++ -c -fmudflap testmudflap.cpp
g++ -lmudflap testmudflap.o -o testmudflap

実行時にエラー出力にこんなメッセージがばりばり出力されます。しかも詳細な情報付き。

mudflap violation 2 (check/write): time=1115184392.643230 ptr=0xbff9d6b8 size=399968
pc=0xb7f1f5b8 location=`testmudflap.cpp:11 (main)'
/usr/local/gcc/4.1.0/lib/libmudflap.so.0(__mf_check+0x48) [0xb7f1f5b8]
./testmudflap(main+0x114) [0x8048938]
/usr/local/gcc/4.1.0/lib/libmudflap.so.0(__wrap_main+0x1e4) [0xb7f20354]
Nearby object 1: checked region begins 0B into and ends 8B after
mudflap object 0x80cbf48: name=`testmudflap.cpp:7 (main) int a [99990]'
number of nearby objects: 1

アクセスエラーが起きた場所だけでなく、どのオブジェクトで問題が起きているのか、オブジェクトを定義した場所まで含めて出してくれてますね。素晴しい!こりゃ使えます。