mudflapはヘボプログラマを救う?
gcc 4.0.0からポインタと配列境界チェックをする機能らしい。
てっきりコンパイラのフラグだと思ってたのですが、どうやらibmudflapというライブラリをリンクすればいいみたいですね。そんなんでうまくいくんかい。
Kita-Cさんが面白いことしているので、ついでに弄ってみたいな。
ということで"-lmudflap"をつけて実行するだけです。
問題のある部分で、下みたいな内容がばらばら出てきます。
...というよりlibGL.so内の問題っぽいんですけど。私にどうしろと?
mudflap violation 3629 (unregister): time=1113146035.400188 ptr=0xb7ece000 size=4096 pc=0x3f3aa1 /usr/local/lib/libmudflap.so.0(__mf_unregister+0x41) [0x3f3aa1] /usr/local/lib/libmudflap.so.0(munmap+0xbb) [0x3f54ab] /usr/lib/libGL.so.1 [0x601697] Nearby object 1: checked region begins 57384B before and ends 53289B before mudflap dead object 0x97fd360: name=`calloc region' number of nearby objects: 1
まあそういうことは置いておいて。
シンプルな例を上げてみます。
#includeint main(void) { int a[100]; for (int i = 0; i < 1000; i++) a[i] = i * i; for (int i = 0; i < 1000; i++) printf("%d:%d\n", i, a[i]); return 0; }
げげ、何にも文句言われないよ。これじゃあ意味がないなぁ。
ということで、ちょっと趣向を凝らしてみます。
#includeint main(void) { int* a = new int[100]; for (int i = 0; i < 1000; i++) a[i] = i * i; for (int i = 0; i < 1000; i++) printf("%d:%d\n", i, a[i]); delete [] a; for (int i = 0; i < 1000; i++) printf("%d:%d\n", i, a[i]); return 0; }
glibc detected *** malloc(): memory corruption (fast): 0x096ab410 ***
おお、これには反応してくれました。
こういう凡ミスはよくやってしまうので嬉しいですね。
少しは使えるかも。
(追記:すみません。ここらへん大嘘です。正しい内容はid:toge:20050504を見て下さい。)