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

[freewnn:00229] struct cnv_env 中のjishomaxの初期化



 お久しぶりです。元木です。

 この数日間 手元で弄っている FreeWnn の挙動が怪しかったので
 調べたところアヤシイところを発見しました。

 配布状態の FreeWnn では malloc といいつつ calloc しているの
 で動作上は問題ないですが気になりましたので...

 なにがアヤシイかといいますと、js_connect (do_env.c) から呼
 ばれる conn1 (do_env.c) の中で、新しく作成した領域を初期化
 するために new_env (do_env.c) しているのですが、new_env 内
 で 構造体cnv_env のメンバーである jishomax を初期化していま
 せん。

 new_env内で sticky も初期化していなので、calloc が 0 で初期
 化してくれるのを見込んで、なにもしていないのかも知れません
 が、明示的でないのは非常にイヤだったのでパッチを投げておき
 ます。

# 0byte 要求されたら 1byte だけ malloc するのも同様にイヤで
# すが :-)

 気に入ったら使ってやって下さい。

 do_env.c.diff:
 
  new_env 内で sticky と jishomax を明示的に初期化していない
  ので明示的に初期化するようにした。

 do_dic_env.c.diff:
 
  del_all_dic_in_env 内ですべての辞書を env[eid] 内から外し
  ているのに jishomax はそのままなので 0 を入れた。
  (でも、この関数を呼んだ後に jishomax を使う箇所は無いはずな
   のでいらないかも。)

 P.S.

   配布状態の FreeWnn では calloc が 0 にしているので動きま
   すが、手元の calloc しないバージョンでは 0 クリアされてい
   ない領域から数値をとってきてしまいます。

   そのため、38141個も辞書を使っていることになったり、偶然前
   に解放した cnv_env の領域と重なって、WNN_JISHOTABLE_FULL 
   になったりと楽しい動作をしてくれました。

sin.
*** do_env.c.orig	Tue Dec 14 20:01:40 1999
--- do_env.c	Tue Dec 14 20:48:58 1999
***************
*** 225,230 ****
--- 225,232 ----
   for(i=0;i<WNN_MAX_FILE_OF_AN_ENV;i++){
  	(e->file)[i]= -1;
   }
+  e->jishomax = 0;
+  e->sticky = 0;
  
   e->fzk_fid = -1;  /* Not Loaded */
   e->nbun = default_para.n;
*** do_dic_env.c.orig	Tue Dec 14 20:00:57 1999
--- do_dic_env.c	Tue Dec 14 20:01:30 1999
***************
*** 283,288 ****
--- 283,289 ----
      for(i=0;i< max; i++){
  	dic_table[jisho[i]].body= -1; dic_table[jisho[i]].hindo= -1;
      }
+     env[eid]->jishomax = 0;
  }