◀ANSI版開発トップへ
  • 4874 正規表現(bregexp.dll ver1.02)の不具合
    • 4876 RE: 正規表現(bregexp.dll ver1.02)の不具合
      • 4877 Re2: 正規表現(bregexp.dll ver1.02)の不具合
        • 4878 Re3: 正規表現(bregexp.dll ver1.02)の不具合
          • 4887 Re4: 正規表現(bregexp.dll ver1.02)の不具合
            • 4888 Re5: 正規表現(bregexp.dll ver1.02)の不具合
            • 4889 Re5: 正規表現(bregexp.dll ver1.02)の不具合
              • 4893 Re6: 正規表現(bregexp.dll ver1.02)の不具合
                • 4894 Re7: 正規表現(bregexp.dll ver1.02)の不具合
                  • 4908 Re8: 正規表現(bregexp.dll ver1.02)の不具合
                • 4938 Re7: 正規表現(bregexp.dll ver1.02)の不具合
      • 4882 RE2: 正規表現(bregexp.dll ver1.02)の不具合
        • 4886 RE3: 正規表現(bregexp.dll ver1.02)の不具合
          • 4957 Re4: 正規表現(bregexp.dll ver1.02)の不具合
            • 4958 Re5: 正規表現(bregexp.dll ver1.02)の不具合
  • [4874] 正規表現(bregexp.dll ver1.02)の不具合 ken2 2007年06月18日 22:14

    はじめまして。いつも使わせていただいております。
    さて、

    ・正規表現 "(a*)*b" (a, bは任意の文字)で文字列 "acab" (cは任意の文字)を
     マッチングするとウィンドウごと落ちます。
    ・"(a*)+b"でも落ちる。

    ・"cab", "ab", "b"をマッチングさせても問題ない。
    ・正規表現 "(a*)*", "b(a*)*", "(a+)+b", "(a+)*b"なら問題ない。

    オリジナルの馬場氏のバージョンからの不具合のようです。
    YukiWikiで使われていた正規表現から抽出したパターンなので、
    それなりに使用されうるパターンだと考えます。
    鬼車はこの不具合はないようです。

    # NFAのままで実装されているならカッコ内の*のイプシロン遷移が
    # 外の*で無限に繰り返されてスタックオーバーフローなのかなと
    # 思いますがperlのはDFAに変換していたような…よくわかりません。
    • [4876] RE: 正規表現(bregexp.dll ver1.02)の不具合 げんた 2007年06月19日 00:13

      >オリジナルの馬場氏のバージョンからの不具合のようです。
      >YukiWikiで使われていた正規表現から抽出したパターンなので、
      >それなりに使用されうるパターンだと考えます。
      bregexpは再帰を使っているので,パターンによってはスタックオーバーフローになって落ちます.
      これは現時点では制限事項としか言えません.
      • [4877] Re2: 正規表現(bregexp.dll ver1.02)の不具合 神楽 2007年06月19日 01:02

        ▼ げんたさん
        > >オリジナルの馬場氏のバージョンからの不具合のようです。
        > >YukiWikiで使われていた正規表現から抽出したパターンなので、
        > >それなりに使用されうるパターンだと考えます。
        > bregexpは再帰を使っているので,パターンによってはスタックオーバーフローになって落ちます.
        > これは現時点では制限事項としか言えません.

        bregonig.dllを正式採用(インストーラに含める)するか
        サクラプロジェクトとして鬼車から正規表現DLLを作成するというのはいかがでしょうか?
        過去にも正規表現エンジンをJRE32.DLLからBREGEXP.DLLに変更したことがあるそうですし。
        • [4878] Re3: 正規表現(bregexp.dll ver1.02)の不具合 げんた 2007年06月19日 01:22

          >bregonig.dllを正式採用(インストーラに含める)するか
          その方が良いでしょうか.ただ正規表現に若干の差異があるみたいなので...
          とりあえずファイル名の変更をしなくても鬼車版を認識するようには修正した方が親切かもしれません.
          • [4887] Re4: 正規表現(bregexp.dll ver1.02)の不具合 K.Takata 2007年06月24日 14:56

            ▼ げんたさん
            > ただ正規表現に若干の差異があるみたいなので...

            非互換点は \w が2バイト文字も含む点ですね。
            自分自身若干不便に感じていますが、これは鬼車の仕様ですし、
            Perl 5.8 もそうなっていますから・・・。

            それ以外は、基本的には機能追加と Perl の挙動に近づける
            修正だと思っていただけばよいかと。


            # bregonig.dll の Unicode 対応版も試作してみました。
            • [4888] Re5: 正規表現(bregexp.dll ver1.02)の不具合 maru 2007年06月24日 19:31

              >> ただ正規表現に若干の差異があるみたいなので...
              >非互換点は \w が2バイト文字も含む点ですね。
              >自分自身若干不便に感じていますが、これは鬼車の仕様ですし、
              >Perl 5.8 もそうなっていますから・・・。
              ># bregonig.dll の Unicode 対応版も試作してみました。

              正規表現のパワフルな使い手さんたちにとってbregonig.dllってどうなのでしょう。
              対応も早いし、素人目には悪くない感じですが。
            • [4889] Re5: 正規表現(bregexp.dll ver1.02)の不具合 げんた 2007年06月25日 02:26

              あ,作者ご本人様...

              手始めに,bregonig.dllのファイル名を変更することなく認識させるパッチを作成しました.
              Patches#1742481です.

              実行ファイルはまとめバイナリとして置きました.
              http://sakura.qp.land.to/?Junk%2Ftest-1.5.16.0

              せっかくなのでついでに聞いてしまいます>K.Takata様
              1) bregonig.dllをパッケージ版(インストーラ)に含めて配布するのは問題ないでしょうか
              2) その際パッケージにはバイナリのみ含めても問題ないでしょうか.
              ライセンスファイルなど併せてパッケージに含めるべきファイルはありますか.
              bregonig.dllのライセンスについてはヘルプファイルに含めてもらおうかなとも思っています.
              • [4893] Re6: 正規表現(bregexp.dll ver1.02)の不具合 K.Takata 2007年06月26日 20:06

                ▼ げんたさん
                > せっかくなのでついでに聞いてしまいます>K.Takata様
                > 1) bregonig.dllをパッケージ版(インストーラ)に含めて配布するのは問題ないでしょうか

                問題ありません。

                > 2) その際パッケージにはバイナリのみ含めても問題ないでしょうか.

                問題ありません。
                オリジナル版の Bregexp.dll と同じように扱っていただければよいかと。

                なお、bregonig.dll にバグが見つかったので、Ver.1.31 を公開しました。
                • [4894] Re7: 正規表現(bregexp.dll ver1.02)の不具合 K.Takata 2007年06月26日 20:25

                  ちなみに、オリジナル版の Bregexp.dll には、バグが少なくとも4つ、
                  Ver 1.02 には3つ残っています。オリジナル版に対するパッチを作ってみました。

                  http://homepage3.nifty.com/k-takata/diary/bregexp-1.03.diff
                  http://homepage3.nifty.com/k-takata/diary/2007-06.html#25b
                  • [4908] Re8: 正規表現(bregexp.dll ver1.02)の不具合 K.Takata 2007年07月07日 21:42

                    > ちなみに、オリジナル版の Bregexp.dll には、バグが少なくとも4つ、
                    > Ver 1.02 には3つ残っています。オリジナル版に対するパッチを作ってみました。

                    もう1件あるのを忘れていました。パッチを更新しておきました。

                    http://homepage3.nifty.com/k-takata/diary/bregexp-1.03.diff
                    http://homepage3.nifty.com/k-takata/diary/2007-07.html#05b
                • [4938] Re7: 正規表現(bregexp.dll ver1.02)の不具合 じゅうじ 2007年07月22日 23:27

                  ▼ K.Takataさん
                  > ▼ げんたさん
                  > > せっかくなのでついでに聞いてしまいます>K.Takata様
                  > > 1) bregonig.dllをパッケージ版(インストーラ)に含めて配布するのは問題ないでしょうか
                  >
                  > 問題ありません。
                  >
                  > > 2) その際パッケージにはバイナリのみ含めても問題ないでしょうか.
                  >
                  > 問題ありません。
                  > オリジナル版の Bregexp.dll と同じように扱っていただければよいかと。

                  VC6 でコンパイルし、
                  Yahoo/Junk/bregexp-1.03.zip に、diffとdllをアップしておきました。
                  プライベート ビルド情報 1.03 Wiki/Junk/33 未対応版です。
      • [4882] RE2: 正規表現(bregexp.dll ver1.02)の不具合 すい 2007年06月21日 23:44

        >bregexpは再帰を使っているので,パターンによってはスタックオーバーフローになって落ちます.

        この「落ちる」ってのだけでも、やめさせてもらえませんかね?
        正規表現キーワードを使用している状態で長い行を表示させるとエディタごと落ちる、とか現状最悪ですし。

        再帰なら、再帰の回数に制限かければ良いだけですよね。

        ・整数数値のグローバル変数を1個用意して、起動時に値を0クリアしておく。
        ・再帰を呼び出す直前で、そのグローバル変数を ++ する。
        ・再帰から帰って来た所で、そのグローバル変数を -- する。

        だけで再帰の回数は分かりますよね。
        で、そのグローバル変数の値が、ある規定値以上に達したら、処理を中断して
        エラーダイアログを出すとか、エラーコードを返すなりすれば良いだけですよね。

        問題はその規定値ですが、、、
        デフォルト値は、どこの環境でも安心できる小さ目の値にしておいて、
        意味を理解できるようなヘビーユーザーは自分で設定変更できるようにしておけば。
        例えば bregexp.dll と同じディレクトリ内にある設定ファイルに
        この再帰の上限値を書き込んでおくとか。
        • [4886] RE3: 正規表現(bregexp.dll ver1.02)の不具合 げんた 2007年06月23日 02:19

          >この「落ちる」ってのだけでも、やめさせてもらえませんかね?
          Windowsの構造化例外を使って,スタックオーバーフローをキャッチすれば回避できるみたいです.
          ただ,スタックオーバーフローを検知した場合にはその時点でマッチしないと判定するので,理論上マッチするはずのパターンを見逃しているように見えることがあります.

          なんとかお試し版を作ってみました.
          http://sakura.qp.land.to/?Junk%2F33

          Wikiの方にも書きましたが,これはVC 2005でコンパイルしています.IsDebuggerPresent()を呼んでいるためにWindows 95では動作しません.VisualToolkit 2003を使ってコマンドラインでコンパイルすると例外をキャッチしてくれません.(だれか助けて)
          • [4957] Re4: 正規表現(bregexp.dll ver1.02)の不具合 ryoji 2007年08月08日 21:49

            ▼ げんたさん
            > Wikiの方にも書きましたが,これはVC 2005でコンパイルしています.IsDebuggerPresent()を呼んでいるためにWindows 95では動作しません.VisualToolkit 2003を使ってコマンドラインでコンパイルすると例外をキャッチしてくれません.(だれか助けて)
            VS2003でも、bregexec_main()の中の最後のcatch(...)ブロックをコメントアウトするとbregexec()のほうの__exceptでキャッチできるようになるみたいです。
            VS2005では、C++例外処理のcatch(...)は構造化例外をキャッチしないようになったということかな?

            対策としては、そのままcatch(...)を除去してその他の例外を放置するか、_set_se_translator()を使って構造化例外も含むすべての例外をC++例外処理でキャッチするか、といったところでしょうか。
            • [4958] Re5: 正規表現(bregexp.dll ver1.02)の不具合 ryoji 2007年08月09日 22:23

              > 対策としては、そのままcatch(...)を除去してその他の例外を放置するか、_set_se_translator()を使って構造化例外も含むすべての例外をC++例外処理でキャッチするか、といったところでしょうか。
              構造化例外とC++例外の場所を逆転するだけで大丈夫みたいですね。

              げんたさんのパッチをもとに、お試し版を更新してみました。
              http://sakura.qp.land.to/?Junk%2F33
              VC2003, VC2005ともOKになってると思います。

              構造化例外フィルタは、関数になっていたのを単純な式に置き換えています。スタックを修復する前に関数呼び出しするのは何か気持ち悪いかな、と思いまして。
              #現状の関数であればスタックアクセスは無さそうなので、例外処理中に別の例外(メモリ保護例外)が発生するということも無いとは思いますが。。。

              VC6でもコンパイルは通るようにしましたが、VC6ではスタック修復のライブラリ関数が使えないので、VC6でコンパイルしたものだとスタックオーバーフローしたときは従来と同じように落ちます。
              (VC6ではコンパイル時に、その旨のワーニングが出るようにしてあります)