正規表現を使った文字列探索/操作コンポーネント集の変更履歴

version 0.16 から version 0.17への変更
2001/03/02
MP3の魔術師さんからメモリリークの疑いがある箇所を報告して頂きましたので公開します。
> さて、現在そのTAWKStrコンポーネントを用いてソフトウェアを開発しているの
> ですが、一つ不具合と思われるものを発見しましたのでご確認ください。
> ホームページのバグ情報には記載されていないものです。
> 
> function TREParser.NegativeCharacterClass: REpNode_t;
> 
> の内部関数
>   procedure RemoveCC(pLeaf: REpNode_t);
> の
>         if (pNode1 <> nil) or (pNode2 <> nil) then
>           aNeg_ParseTree.LeafList.Delete(i);
> 
> この部分、Deleteしてリストから削除していますが、Disposeしていません。
> よって、
>         if (pNode1 <> nil) or (pNode2 <> nil) then begin
>           Dispose(REpNode_t(aNeg_ParseTree.LeafList[i]));
>           aNeg_ParseTree.LeafList.Delete(i);
>         end;
> 
> として対処しましたが、これでよいのでしょうか?
2000/12/01
おかぽん さんから、2000/11/16のバグを修正するための情報をいただきましたので公開します。
>   あれから、気になっていろいろソースをさわっていたら、私もよくわかって
>   いないのですが(;^_^A~~、どうやら解決したようです。
>   例のごとく、メモリーリークチェックを使用しましたが、エラー報告されません
>   でした。ということで、「解決したのかな?」というレベルです。
>   
>   こちらでの修正点を書いてみます。
>   適当に改行をいれてありますので、見にくいかもしれません m(v_v)m
>   
>   (1)--------------------------------------------------------------
>                                         ___/var追加
>   > function TRE_DFA.Register_DFA_State(var aStateSet: TRE_NFAStateSet)
>   >                                                  : RE_pDFAState_t;
>    (省略)
>   >   New(result);
>   >   with result^ do begin
>   >     StateSet := aStateSet;
>   >     visited := False;
>   >     if aStateSet.Has(FNFA.ExitState) then
>   >       accepted := True
>   >     else
>   >       accepted := False;
>   >     next := nil;
>   >   end;
>   >   aStateSet := nil;
>       ^^^^^^^^^^^^^^^^^追加
>   >   FStateList.add(result);
>   > end;
>   
>   (2)------------------------------------------------------------------
>   > { NFAを等価なDFAへと変換する}
>   > procedure TRE_DFA.Convert_NFA_to_DFA;
>    (省略)
>   >     while pDFA_TransNode <> nil do begin
>   >       { NFA状態集合のε-closureを求める}
>   >       Collect_Empty_Transition(pDFA_TransNode^.ToNFAStateSet);
>   > 
>   >       { 遷移情報をDFA状態に加える}
>   >       New(pDFA_StateSub);
>   >       with pDFA_StateSub^ do begin
>   >         next := nil;
>   >         CharClass := pDFA_TransNode^.CharClass;
>   >         next := t^.next;
>   >       end;
>   >       t^.next := pDFA_StateSub;
>   > 
>   >       {現在のDFA状態からの遷移先の新しいDFA状態を登録}
>   >       pDFA_StateSub^.TransitTo :=
>   > 	Register_DFA_State(pDFA_TransNode^.ToNFAStateSet);
>   >       {Register_DFA_StateメソッドによりToNFAStateSet
>   >        オブジェクトはDFA_Stateに所有される}
>   >       {pDFA_TransNode^.ToNFAStateSet := nil;}
>           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>           Register_DFA_Stateで設定するのでコメント化
>   > 
>   >       pDFA_TransNode := pDFA_TransNode^.next;
>   >     end;
>   (省略)
>   
>   (3)-----------------------------------------------------
>   > {Compute_Reachable_N_state が作る RE_DFATransNode_t型のリンクリストを破棄する}
>   > procedure TRE_DFA.Destroy_DFA_TransList(pDFA_TransNode: RE_pDFATransNode_t);
>   (省略)
>   
>   >     while pDFA_TransNode <> nil do begin
>   >       pNext := pDFA_TransNode^.next;
>   >       if pDFA_TransNode^.ToNFAStateSet <> nil then
>           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^追加
>   >         pDFA_TransNode^.ToNFAStateSet.Free;
>   >       Dispose(pDFA_TransNode);
>   > 
>   >       pDFA_TransNode := pNext;
>   >     end;
>   (省略)
>   
>   
>   
>   以上の3点を修正したところ、見事に(?)メモリーリークが消え去りました。
>   正直言って、100%理解して修正したわけではありません(;^_^A~~
>   ですので、これが正解かどうかは、あまり自信がないのですが、とりあえず
>   メモリーリーク危険を回避できたという報告です。
>   
>   それでは。
2000/11/16
おかぽん さんからバグ情報をいただいたので公開します。
> 現象は、TAWKStrのMatchメソッドで発生しました。
> 
> そのときのプロパティは以下の通りです
> LineSeparator = mcls_CRLF
> UseFuzzyCharDic = True
> UseSynoynDic = False
> RegExp = 任意の文字列
> 
> UseFuzzyCharDic = False のときには、メモリーリークが発生しません。
> 
> 堀 浩行氏作成ののメモリーリークチェッカーコンポーネント
> (Http://www.yks.ne.jp/~hori/)により発見しました。
> 
> メモリーリークの原因は、bmRegExp.pasユニットの
> 「TRE_DFA.Compute_Reachable_N_statem」メソッド内、
> 
> >ToNFAStateSet := TRE_NFAStateSet.Create(FNFA.StateList.Count);
> >ToNFAStateSet.Include(pNFANode^.TransitTo);
> この部分のようです。ここでクリエイトされたされたクラスが、破棄されて
> いないのが原因のようなのですが。