toge's diary

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

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 

まあそういうことは置いておいて。
シンプルな例を上げてみます。

#include 

int 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;
} 

げげ、何にも文句言われないよ。これじゃあ意味がないなぁ。
ということで、ちょっと趣向を凝らしてみます。

#include 

int 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を見て下さい。)