ありがとう、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)
こんなメッセージが。すごいなぁ…