我发现了一个案例,例如在正则表达式中使用 \w 时,带有空格的 500 个字母/数字会使 PCRE 爆炸。我已经尝试过 bohTPerlRegEx
和 Delphi XE2 pcre/obj 实现。两者都一样。
然后我试着打电话
pcre_config(PCRE_CONFIG_MATCH_LIMIT, @vSysStrRegex_MatchLimit_Value);
但是设置匹配限制似乎没有任何效果。我使用它的方式是为每个线程调用一次。(注意:其他人已经设置了这个以获得不设置这样的设置)
我真的需要正则表达式库退出解析而不是继续直到它溢出堆栈。(似乎几乎不可能从中恢复线程/程序。)
在这种情况下如何防止堆栈溢出?我无法控制解析的内容或正则表达式。因此,我专门寻找通过设置或类似设置避免 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, ...)