[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[freewnn:00910] Re: atod SEGV
- To: freewnn@XXXX
- Subject: [freewnn:00910] Re: atod SEGV
- From: aono@XXXX (Tomoki AONO)
- Date: Thu, 5 Sep 2002 19:24:51 JST
- In-reply-to: Your message of "Sun, 1 Sep 2002 03:30:14 JST". <020901033014.M0117382@ikoma.cc.osaka-kyoiku.ac.jp>
- Reply-to: freewnn@XXXX
青野です。こんばんは。
とりあえず原因らしきものが見つかりましたのでご報告します。
<020901033014.M0117382@XXXX>の記事において
青野は書きました。
>> <1030505588.30747.47.camel@Remba>の記事において
>> zic-fw@XXXXさんは書きました。
>>
>> >> 単純に、読みの長さが問題という気もして来ました。
>> >> 添付ファイルで、私の環境では確実に SEGV となります。
>> >>
>> >> 読みを9文字以内にすると、OKに見えます。
>>
>> 問題の関数はLittle Endianなアーキテクチャ(x86など)でしか呼
>> ばれないのでsparc-sun-solaris2.4な環境では再現しませんでし
>> た。
問題はrev_ud_hontai()にあった模様です。ここで参照している
hostart(から始まるバイト列)は元々ujistoud() (in atod.c)で
代入されているのですが、歴史的(?)理由により始めの4バイトは
(intで) 0が代入されています。そのためrev_ud_hontai()でもそ
の慣習に合わせるようにしました。
#なぜそのようなことをしているのかは…どなたか教えてください(^^;
>> 恐らくLittle Endianなら他のOSでも再
>> 現できると思われますが、そこまでは確認できてません。
FreeBSD-4.3(x86)ではクラッシュせずに終わりましたが、たまた
ま大丈夫だっただけのように見えます。出力された辞書をodでみ
る限り、パッチを当てたatodによるものと異なるようなので、実
際に辞書が使えないかもしれません。
#これも誰か確かめてみてください(^^;;;。
(.signatureの)後にCVSソース向けのパッチを付けておきます。
atodのUsageも書き換えましたのでご賞味ください。問題がなけ
ればcommitします。
#RedHatのSRPMから構築する際はrevdic.cのところだけでも適用
#してください。
ちなみに「登録可能形式辞書」の英訳はボンドさんによる
atod.man(英訳)を参考にしました。
----
青野智樹 (aono@XXXX)
(以下パッチ)
Index: Wnn/etc/revdic.c
===================================================================
RCS file: /cvs/freewnn/FreeWnn/Wnn/etc/revdic.c,v
retrieving revision 1.3
diff -u -r1.3 revdic.c
--- Wnn/etc/revdic.c 14 Jun 2001 18:15:55 -0000 1.3
+++ Wnn/etc/revdic.c 5 Sep 2002 09:53:43 -0000
@@ -80,7 +80,7 @@
int k;
int len;
- for (hop = (struct uind2 *) hostart; (UCHAR *) hop < hoend;)
+ for (hop = (struct uind2 *)((int *) hostart + 1); (UCHAR *) hop < hoend;)
{
rev_int (&(hop->next));
rev_int (&(hop->serial));
Index: Wnn/jutil/atod.c
===================================================================
RCS file: /cvs/freewnn/FreeWnn/Wnn/jutil/atod.c,v
retrieving revision 1.10
diff -u -r1.10 atod.c
--- Wnn/jutil/atod.c 14 Jul 2002 04:26:57 -0000 1.10
+++ Wnn/jutil/atod.c 5 Sep 2002 09:53:43 -0000
@@ -520,11 +520,12 @@
static void
usage ()
{
- fprintf (stderr, "Usage : %s [-r -R -S -e -s maximum word count(default %d) -P passwd (or -N) -p hindo_passwd (or -n) -h hinsi_file_name] <dictonary filename>\n", com_name, MAX_ENTRIES);
+ fprintf (stderr, "Usage : %s [-r -R -S -U -e -s maximum word count(default %d) -P passwd (or -N) -p hindo_passwd (or -n) -h hinsi_file_name] <dictonary filename>\n", com_name, MAX_ENTRIES);
fprintf (stderr, "Input the ascii dictionary from stdin\n");
fprintf (stderr, "-r is for creating dictionary with normal and reverse index\n");
- fprintf (stderr, "-R is for creating reverse dictionary\n");
- fprintf (stderr, "-S is for creating static dictionary.\n");
+ fprintf (stderr, "-R is for creating reverse (implies updatable) dictionary. (default)\n");
+ fprintf (stderr, "-S is for creating static dictionary.\n");
+ fprintf (stderr, "-U is for creating updatable dictionary.\n");
fprintf (stderr, "-e is for compacting kanji string.\n");
exit1 ();
}