憂鬱な午後のひととき


7月1日_
valgrindでvalgrind-test.cppみたいなソースをチェックすると
==13661== Syscall param write(buf) points to uninitialised byte(s)
==13661==    at 0x41FB194: write (in /lib/libc-*.so)
==13661==    by 0x41A2297: new_do_write (in /lib/libc-*.so)
(snip)
==13661==    by 0x4164A73: exit (in /lib/libc-*.so)
==13661==    by 0x4152174: (below main) (in /lib/libc-*.so)
==13661==  Address 0x401f000 is not stack'd, malloc'd or (recently) free'd
とかなってputchar(sum(buf))付近ばかり探していた(もちろん本当はもっと複雑だったけど)ら実は原因はずっと遠かった. valgrindは未初期化メモリの演算は未初期化として伝搬するけど演算だけでは警告を出さないようだ. 結構苦労して特定されたが実はvalgrind 3.4.0から--track-origins=yesというオプションが増えていた.
==13719==  Address 0x401f000 is not stack'd, malloc'd or (recently) free'd
==13719==  Uninitialised value was created by a stack allocation
==13719==    at 0x8048485: main (t.cpp:20)
と出るやん. やられた. ところで未初期化と言ってもたとえば
int main()
{
    int a;
    a ^= a;
    putchar(a);
}
みたいなのはaが正しく0になってると理解して警告を出さない. xor eax, eaxで0初期化は常套手段なので「未初期化の演算結果は必ず未初期化」だと使い物にならなくなるからだろうけど凄いなあ.

御意見は光成滋生<herumi@nifty.com>までお願いします