たとえば、正規表現で\ wを使用すると、空白を含む500文字/桁でPCREが爆発する場合があります。bohTPerlRegEx
とDelphiXE2のpcre/objの実装を試しました。どちらも同じです。
それから私は電話してみました
pcre_config(PCRE_CONFIG_MATCH_LIMIT, @vSysStrRegex_MatchLimit_Value);
ただし、一致制限を設定しても効果はないようです。私が使用している方法は、スレッドごとに1回呼び出すことです。(注:他の人は、このような設定を行わないようにこれを設定しています)
スタックがオーバーフローするまで続行するのではなく、解析を中止するために正規表現ライブラリが本当に必要です。(そこからスレッド/プログラムを回復することはほぼ不可能のようです。)
この状況でスタックオーバーフローを防ぐにはどうすればよいですか?解析されるコンテンツや正規表現を制御できません。したがって、私は特に、PCREが設定などを介してスタックオーバーフローに遭遇するのを回避する方法を探しています。
TPerlRegExコードを編集することによる解決策:
function TPerlRegEx.Match(AStartOffset: Integer = 0): Boolean;
...
if FHints <> nil then // set by "study" call
begin
PPCREExtra(FHints)^.flags := PPCREExtra(FHints)^.flags or PCRE_EXTRA_MATCH_LIMIT_RECURSION;
PPCREExtra(FHints)^.match_limit_recursion := 750 // 1000 too much in tests
end
;
OffsetCount := pcre_exec(FPattern, FHints, ...)