malloc/freeでSIGSEGVが発生する。

以前あったことをメモっておく。

Solaris SPARCでCプログラミングをしてたとき、malloc関数(free関数)でセグメント違反が発生することがあった。
スタックトレースは下のような感じで。(アドレスは適当)

#0 0xfed4247c in realfree() from /usr/lib/libc.so.1
#1 0xfed42d88 in cleanfree() from /usr/lib/libc.so.1
#2 0xfed41ebc in _malloc_unlocked() /usr/lib/libc.so.1
#3 0xfed41db0 in malloc() from usr/lib/libc.so.1
#4 0x131e0 in main(argc=1,argv=0xxxxxxxx)

最初は、「ライブラリ関数内でバグっているんじゃないか」と思ったけど、調べるとどうやら違うみたい。
webで調べても濁した記述しか無くて、手元のDEBUG HACKSをみたらジャストな事例があった。

Debug Hacks -デバッグを極めるテクニック&ツール

Debug Hacks -デバッグを極めるテクニック&ツール

で何が悪かったかというと、自分のソースがバグってて、(セグメント違反になる前のどこかで)mallocした領域に対してバッファアンダーフローしてた。
どうやらmallocした領域のちょっと前に、ライブラリ用のデータを書き込んでいて、そこが破壊されるとそれ以降のmalloc/freeがおかしくなるようだ。
詳しくは pacsec.jp/psj06archive.htmlなどを参照。

それにしても、バッファアンダーフローした瞬間にはわからないから厄介だった。