◀ANSI版開発トップへ
  • 2533 無限に置換が行われる
    • 2536 Re:無限に置換が行われる
      • 2537 Re2:無限に置換が行われる
      • 2540 Re2:無限に置換が行われる
        • 2674 Re3:無限に置換が行われる
          • 2696 Re4:無限に置換が行われる
            • 2697 Re5:無限に置換が行われる
              • 2698 Re6:無限に置換が行われる
              • 2699 Re6:無限に置換が行われる
            • 2726 Re5:無限に置換が行われる
              • 2739 Re6:無限に置換が行われる
  • [2533] 無限に置換が行われる roshi 2002年12月21日 17:38

    いつもサクラエディタにはお世話になっています。
    置換を利用していた際に題名の現象が発生しましたので、念のためご報告させて頂きます。

    <再現方法>
    1.サクラエディタに下記のテキストをペースト
    =======ここから=======
    20020318/
    20020325/
    20020401/
    =======ここまで=======
    2.下記の正規表現を利用して置換を実行
    置換前:/[\r\n]+$
    置換後:(半角スペース)

    #置換は正常に行われました
    • [2536] Re:無限に置換が行われる もか 2002年12月27日 02:56

      ▼ roshiさん
      > 置換前:/[\r\n]+$
      > 置換後:(半角スペース)
      ということは、理論上の正しい動作の場合は3回置換して終わるはずです。
      このパターンの場合は、確かにsakuraのバグっぽいです。
      (所で4回目以降の置換は何を何に置換してるんだ?)
      もし、無限ループしない方法・ソースの修正など、解る方ご一報お願いします。
      (私はこの辺の動作が良くわかっていないので、断念)

      #以下のようなものが無限ループならそういうものだとは思います
      #置換前:[\r\n]+$
      #置換後:,
      • [2537] Re2:無限に置換が行われる もか 2002年12月27日 03:05

        > #以下のようなものが無限ループならそういうものだとは思います
        > #置換前:[\r\n]+$
        > #置換後:,
        と書きましたが、正しくは

        置換前:[\r\n]*$

        の場合でした。
      • [2540] Re2:無限に置換が行われる かろと 2002年12月29日 05:47

        ▼ もかさん
        > ▼ roshiさん
        > > 置換前:/[\r\n]+$
        > > 置換後:(半角スペース)
        > ということは、理論上の正しい動作の場合は3回置換して終わるはずです。
        > このパターンの場合は、確かにsakuraのバグっぽいです。
        > (所で4回目以降の置換は何を何に置換してるんだ?)
        > もし、無限ループしない方法・ソースの修正など、解る方ご一報お願いします。
        > (私はこの辺の動作が良くわかっていないので、断念)

        全然わかってないですが、トレースの結果 ここがまずそうという所
        見つけました。

        CDocLineMgr.cpp の 1731行目 (SearchWord() 内)
        if( nIdxPos <= (nLineLen - pDocLine->m_cEol.GetLen() ) && // 2002.02.08 hor $の次検索で次の行に移動できない問題を回避
        ~~~~
        if( nIdxPos < (nLineLen - pDocLine->m_cEol.GetLen() ) && // 2002.02.08 hor $の次検索で次の行に移動できない問題を回避
        ~~~
        と、等号を外せば、無限ループにならないようです。
        なんとなくOKそうなのですが、ちと自信ありません。(笑)

        フォローお願いします。

        • [2674] Re3:無限に置換が行われる かろと 2003年04月09日 21:59

          ▼ かろとさん
          > ▼ もかさん
          > > ▼ roshiさん
          > > > 置換前:/[\r\n]+$
          > > > 置換後:(半角スペース)
          > > ということは、理論上の正しい動作の場合は3回置換して終わるはずです。
          > > このパターンの場合は、確かにsakuraのバグっぽいです。
          > > (所で4回目以降の置換は何を何に置換してるんだ?)
          > > もし、無限ループしない方法・ソースの修正など、解る方ご一報お願いします。
          > > (私はこの辺の動作が良くわかっていないので、断念)
          >
          > 全然わかってないですが、トレースの結果 ここがまずそうという所
          > 見つけました。
          >
          > CDocLineMgr.cpp の 1731行目 (SearchWord() 内)
          > if( nIdxPos <= (nLineLen - pDocLine->m_cEol.GetLen() ) &&
          > ~~~~
          > if( nIdxPos < (nLineLen - pDocLine->m_cEol.GetLen() ) &&
          > ~~~
          > と、等号を外せば、無限ループにならないようです。
          > なんとなくOKそうなのですが、ちと自信ありません。(笑)
          >
          > フォローお願いします。

          フォローなし・・・(;_;)
          • [2696] Re4:無限に置換が行われる かろと 2003年04月28日 23:55

            前回のは、改行だけの行を置換できなかったようです。m(__)m

            今度こそ・・です。
            CBregexp.cpp(210)に以下を追加
            // From Here Apr. 28, 2003 かろと
            // 検索開始位置が検索対象文字列の長さ以上の時は、
            // 検索する文字列がないハズだが、\r\nを検索した場合にBMatch()がtrueを返すため
            // 置換の無限ループに陥っていた。ここで、除外して falseを返す。
            if (nStart >= len) {
            return false;
            }
            // To Here Apr. 28, 2003 かろと

            問題は、BMatch()で、EOFが最後にある行の置換で、最後が \r\nでないにもかかわらず、
            trueを返してきていることのようです。
            恐らく、CDocLineMgr.cpp(1729)の以下の行は
            if(nIdxPos<(pRegexpData->endp[0]-pLine)){ // 2002.02.08 hor EOF直前の文字が何度もマッチしてしまう問題を回避
            この無限置換の対策のようなのですが、BMatch()がtrueを返した時は、endp[0]も進んでいて、
            残念ながら、この条件では無限置換を回避できないようです。

            今回の対策は、上記のように、
            GetMatchInfo()内で、検索する余地がない(=行の最後から検索しようとしている)
            場合は、falseを返してやろうというものです。

            置換前:[\r\n]+
            置換後:
            と
            置換前:[\r\n]+
            置換後:(半角スペース)

            では、うまく行ってますが、自信はないので、フォローいただければ幸い。


            行(最後はEOFなので何もない)
            • [2697] Re5:無限に置換が行われる かろと 2003年04月29日 01:10


              Ver 1.3.9.0 に 無限置換対策

              ▼ かろとさん
              > 今度こそ・・です。
              > CBregexp.cpp(210)に以下を追加
              +
              > CDocLineMgr.cpp(1729)の以下の行の削除

              を行ったものを

              http://www.egroups.co.jp/files/sakura-editor/Junk/sakura_test20030428.lzh

              に置きました。バグ出しに協力いただける方はお願いします。
              • [2698] Re6:無限に置換が行われる かろと 2003年04月30日 04:43

                eGroupはダウンロードの制限があるので、置くのはまずい。
                と書いてあるのを見つけました。
                すみません。

                Tripodのフリースペース借りて、置き直しました。

                http://members.tripod.co.jp/karoto/Archive/sakura_test20030428.lzh

              • [2699] Re6:無限に置換が行われる すい 2003年04月30日 16:50

                すい@実家です。いや~~、Win98 なんで念願の SqlSlammer に、さらに
                ついでに CodeRed.F まで捕獲できてウハウハです。WormCatcher。
                ダイヤルアップだからあんまり長時間接続できないのが難点ですが。遅いし。

                >http://www.egroups.co.jp/files/sakura-editor/Junk/sakura_test20030428.lzh
                >
                >に置きました。バグ出しに協力いただける方はお願いします。

                改行色々置換してみましたけど問題ないみたいです。
                無限置換にもならないですし。
                今のところ他にも問題なさげです。
            • [2726] Re5:無限に置換が行われる 蒔田 信幸 2003年05月12日 11:46

              ▼ かろとさん
              開発、大変なお仕事だと思います。

              > 今度こそ・・です。
              >
              > 恐らく、CDocLineMgr.cpp(1729)の以下の行は
              > if(nIdxPos<(pRegexpData->endp[0]-pLine)){ // 2002.02.08
              > この無限置換の対策のようなのですが、BMatch()がtrueを返した時は、endp[0]も進んでいて、
              > 残念ながら、この条件では無限置換を回避できないようです。

              置換前:^\r\n
              置換後:無し

              置換前:\r\n
              置換後:無し

              これら、2つが両方とも目的を達するする為には、
              CDocLineMgr.cpp(1729)の以下の行が必要です。
              条件以下8行を削除しないでいただきたいと思います。
              削除した場合、両方とも何も行わない結果になりました。
              ---p.s.----------------------
              ベータ版では正しく動きました。失礼しました。
              • [2739] Re6:無限に置換が行われる かろと 2003年05月13日 22:43

                ▼ 蒔田 信幸さん
                > CDocLineMgr.cpp(1729)の以下の行が必要です。
                > 条件以下8行を削除しないでいただきたいと思います。
                > 削除した場合、両方とも何も行わない結果になりました。

                誤解を与えたようです。
                1729行のおかげで行頭文字が検索できない不具合を混入しており、
                無限置換の対策として、1729行では不十分だという意味です。
                それ以下の行は消しません。さすがに、それを消すと置換ができませんので(--;


                > ---p.s.----------------------
                > ベータ版では正しく動きました。失礼しました。