パスワードを忘れた? アカウント作成
398110 journal

okuの日記: urlview segfault

日記 by oku

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 追記:

自分の日記へのハイパーリンクが間違っていたので修正。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

最初のバージョンは常に打ち捨てられる。

読み込み中...