gpt4 book ai didi

regex - Delphi PCRE/正则表达式实现和堆栈溢出

转载 作者:行者123 更新时间:2023-12-03 15:55:03 25 4
gpt4 key购买 nike

我发现了一个案例,例如在正则表达式中使用\w 时,500 个带有空格的字母/数字会使 PCRE 崩溃。我尝试过 boh TPerlRegEx 和 Delphi XE2 pcre/obj 实现。两者都一样。

然后我尝试打电话

pcre_config(PCRE_CONFIG_MATCH_LIMIT, @vSysStrRegex_MatchLimit_Value); 

但是设置匹配限制似乎没有任何效果。我使用它的方式是为每个线程调用一次。 (注意:其他人已将其设置为get而不是set这样的设置)

我真的需要正则表达式库退出解析,而不是继续解析,直到它溢出堆栈。 (似乎几乎不可能从中恢复线程/程序。)

在这种情况下如何防止堆栈溢出?我无法控制解析的内容或正则表达式。因此,我专门寻找通过设置或类似设置来避免 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, ...)

最佳答案

您引用了some PCRE documentation它描述了使用 --with-match-limit-recursion 配置选项在编译时设置递归限制。如果您自己构建 PCRE 库,则可以使用该选项。如果您在同一文档的其他地方阅读,您会发现传递给 pcre_execpcre_extra block 的 match_limit_recursion 字段的说明:

The default value for match_limit_recursion can be set when PCRE is built; the default default is the same value as the default for match_limit. You can override the default by suppling pcre_exec() with a pcre_extra block in which match_limit_recursion is set, and PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the flags field. If the limit is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT.

因此,将递归限制设置为低于默认值。默认值显然比实际可用的堆栈空间还要高;如果它较低,那么您已经会收到PCRE_ERROR_RECURSIONLIMIT错误,而不是操作系统引发的堆栈溢出异常。

我不知道 Delphi 特定的包装器如何表示此设置。

关于regex - Delphi PCRE/正则表达式实现和堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com