oku (4610) の日記
urlview segfault
urlview が segfault する件ですが、動きを追ってみたところ、
snprintf (buf, sizeof (buf), command, quote (scratch, sizeof (scratch), url[current]));
の先で、
(gdb) bt
#0 0x0000002a95826ab0 in strlen () from /lib/libc.so.6
#1 0x0000002a957fcb62 in vfprintf () from /lib/libc.so.6
#2 0x0000002a9581b8b6 in vsnprintf () from /lib/libc.so.6
#3 0x0000002a95803463 in snprintf () from /lib/libc.so.6
#4 0x000000000040214c in main (argc=-1073749536,
argv=0x7fbffff748)
at urlview.c:510
のように落ちていました。
この手の bt に陥る原因は、大抵の場合上記のコードの quote の結果が NULL だったり読み込み可能なメモリの外だったり、\0 がなかったりすることです。 ということで、更に原因を切り分けるため、該当箇所を2行に分けてみました。
{
quote (scratch, sizeof (scratch), url[current]);
snprintf (buf, sizeof (buf), command, scratch);
}
segfault しなくなりました。 ええっと、これはつまり gcc の... (;_;)
2004-11-06 追記:
よくよく urlview のソースを眺めてみたところ、gcc に問題があるのではなく、urlview.c に問題があることが分かりました。 よくある LP64 問題です。 ILP32 では int と char* は同じ幅を持っていますが、LP64 では両者は同じではありません。 で、quote() のプロトタイプ宣言を #include していなかったばっかりに quote の戻り値が int と解されてしまい、32bit の戻り値が消されてしまった、というのが真の原因です。
2004-12-05 追記:
自分の日記へのハイパーリンクが間違っていたので修正。