ありがとう、Valgrind。

libcのmallocの中でSEGVする…
それは、それは、恐しい状況。よーするに、バッファを超えて書いてるみたいな感じ、というか、まさにそれだ。


んで、まさに、さっきまで、そういう状況だったのである。
「もう無理かもしれない…」
そんな状況で、(以下略)


えーと、まあいいか。よーするに、Valgrindが便利だった、っていう話。
emerge efence したら、「今はefenceは使えません、gccをなんとかするか、Valgrindを使ってください」とか出てきたので、その名前を知った次第。
コンセプトはElectric Fenceみたいな感じ。mallocした領域を超えたところを読み書きしたら、エラーを出してくれるというもの。あと、メモリリークの検出とか。
efenceと違って、即終了しないし、メッセージが読みやすい。


あと、未初期化変数でブランチしてるところの検出とか。どーやって実装してんだ…こんなの?

#include <stdio.h>

int main()
{
  int x;

  if ( x == 0 )
    return 0;

  return 1;
}

これを実行すると、

==5005== Conditional jump or move depends on uninitialised value(s)
==5005==    at 0x8048368: main (test.c:7)

こんなメッセージが。すごいなぁ…