10

古い Boost 正規表現コードを C++11 に変換している途中で、テスト ケースの 1 つで問題に遭遇しました。これは、std::regex を使用してスタック オーバーフロー例外を引き起こすシナリオですが、boost::regex では正常に機能しました。正規表現パターンを変更しておらず、パターンが希望どおりであることを確認しました。この特定の文字列入力フラグメントがスタック オーバーフローを引き起こしているようです。VS2012、x64 デバッグ ビルドを使用:

std::regex regx( "(^|\\})(([^\\{:])+:)+([^\\{]*\\{)" );

    const std::string testinput = " COLOR: #000; BACKGROUND-COLOR: #FFF; FONT-FAMILY: VERDANA, ARIAL, HELVETICA, SANS-SERIF; BACKGROUND:URL(URL(___FOO___)); BACKGROUND-2:URL(URL(___FOO___)); BORDER: 0 0 0 0; BORDER-2: 0 0 0; BORDER-3: 0 0; BORDER-4: 0PX; BORDER-5: 0.6; FILTER:PROGID:DXIMAGETRANSFORM.MICROSOFT.ALPHA(OPACITY=100); } ";
    std::smatch what;
    // this next line causes a stack overflow
    std::regex_search( testinput.cbegin(), testinput.cend(), what, regx );  

例外の後のコール スタックを見ると、正規表現の実装である種の無限再帰が行われているようです。現在、これをテストするための GCC がありません。私は何を間違っていますか?

更新: 以下の提案の後、このコードをコンソール アプリの VS 2012 x64 デバッグに貼り付けたところ、スタック オーバーフローが発生しました。x64 リリース、または Win32 デバッグまたはリリースに変更すると、問題なく動作します。は???VS やプラットフォーム SDK を再インストールする必要がありますか? 私はWin7 x64を使用しています。

更新 #2: やや関連する投稿: なぜ std::regex_iterator がこのデータでスタック オーバーフローを引き起こすのですか? 正規表現を書き直せば役立つと思います。なぜビット数が重要なのかはまだわかりません。そして、それが他の人には機能するのに、私のシステムでは機能しない理由. はぁ。

4

1 に答える 1

2

これを x64 デバッグ ビルドで再現しましたが、これは本当のスタック オーバーフローだと思います。

スタック サイズを 10MB 程度に変更すると (リンカー コマンド ライン オプション/STACK:"10000000")、正常に動作します。

于 2013-04-02T04:26:03.620 に答える