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

[SPAM:Low] [dennou-ruby:003008] [ruby-hdfeos5] bug



西澤です

ruby-hdfeos5 をちょっとだけ見てみました。
気がついたことを


hdfeos5sw_wrap.c の
hdfeos5_swchkswathname で、

o_swathlist[o_strbufsize] は '\0' で初期化されていないので、
rb_str_new2(o_swathlist) ではなく rb_str_new(o_swathlist, o_strbufsize) を使う必要があります。
(ちなみに、rb_str_new を使うと rb_str_new2 を使うよりも関数呼び出しが減って誤差程度ですが速くなります)

また、o_swathlist は ALLOCA_N でメモリを確保していますが、
解放されないので、ゴミがたまっていきます。
rb_str_new (and rb_str_new2) では、データ(文字列)を内部でコピーしますので、
rb_str_new を使ったあと、自分で free(o_swathlist) する必要があります。

こんな感じになるでしょうか
VALUE
hdfeos5_swchkswathname(VALUE mod)
{
   :
 VALUE rstr;
   :
 rstr = rb_str_new(o_swathlist, o_strbufsize);
 free(o_swathlist);
 return rstr;
}

他の場所は見ていませんが、
rb_str_new2 や alloc を使っている場所は同じようにチェックする必要があると思います。




lib/hdfeos5.rb で、
has_(grid|point|za)? をすると、chk(grid|point|za)? が無いという例外があがりますが、
わかりにくいので、grid,point,zaを実装するまでは、
まだ未実装だというメッセージの例外をあげるか、メソッド定義をコメントアウトしておくほうがいいと思います。




-- 
Seiya Nishizawa
Department of Earth and Planetary Atmospheric Sciences, Kobe University