[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00100] Re: illigal memory access.



片山@PFUです。

Date: 18 Aug 1999 13:43:47 +0900
From: MOTOKI Sinichi <sin@itl.co.jp>

> 事の発端は、日々 FreeWnn を使っていると時々、付属語ファイル
> 関連でエラーが出ることから始まります。

どのようなエラーなのでしょうか。私が気が付いていないだけなのか、
環境の違いのためなのか、このようなエラーを見たことがありません。

> さて、エラーになるのも腹が立つのでデバックしようと -g と 
> Electric Fence(malloc debugger の一種) をリンクした jserver 
> を立ち上げたのですが、エラー以前に segmentation fault して
> しまいました。

> fkz_ckvt内で、引数を
>>ft->kango_vect_area(struct kangovectへのポインター) + vector(引数)
> として fkz_ck_vector を呼び出しているのですが、
> fkz_ck_vector内で、このポインターの指す領域を参照している部
> 分があり、ここで segmentation fault しているようです。
> (確保した領域の先頭から -1 した領域ならば segmentation
>  fault で当然ですよね?)

sizeof(struct kangovect) は 13 * sizeof(int) なので、大抵の環境
では、先頭 - 1 の要素も参照できてしまいます。

#もちろん、代入したらアウトです

Electric Fence は知らないのですが、malloc debugger の一種という
ことですので、これが影響している可能性もあります。或は、fzk_ckvt 
が誤った結果を返すために、後の部分で誤った領域を破壊しているのか
も知れません。

それはともかく、バグには違いありませんので、修正は必要ですね。

>  - sbn_kai(bnsetu_kai.c), zen_sbn(jikouho_d.c) において、
>    endvect1 が WNN_VECT_NO の場合は、fkz_ckvt を呼び出さない
>    ようにした。

>*** bnsetu_kai.c.orig	Wed Aug 18 13:38:48 1999
>--- bnsetu_kai.c	Wed Aug 18 12:53:16 1999

>*** jikouho_d.c.orig	Wed Aug 18 13:38:06 1999
>--- jikouho_d.c	Wed Aug 18 13:17:00 1999

fzk_ckvt() を使っている場所は4ヶ所ありますから、2ヶ所修正漏れ
になっています。

># 本題のエラーはさっぱり出なくなってしまいました (^^;

エラーが出なくなったということですが、修正漏れがあるのは気持ち悪
いので、fzk_ckvt() を直した方がよいと思います。

――――ここから――――ここから――――ここから――――ここから――――
--- fzk.c.ORG	Tue Mar 23 18:24:44 1999
+++ fzk.c	Fri Aug 20 14:34:57 1999
@@ -539,7 +539,7 @@
 fzk_ckvt(vector)
 register int	vector;
 {
-	return (fzk_ck_vector(((struct kangovect *) ft->kango_vect_area + vector)));
+	return vector >= 0 && fzk_ck_vector(&ft->kango_vect_area[vector]);
 }
 
 
――――ここまで――――ここまで――――ここまで――――ここまで――――

#ついでに、意味不明なポインター式をすっきりさせました

安全のためには vector の上限のチェックも入れるべきなのですが、附
属後ファイルを読み込んだ時に上限値を捨ててしまっています。:-(

上限値を struct FT に入れておくように修正するのは、落ち着いてか
らにしたいと思います。
--
片山@PFU