【问题标题】:PHP segfault on regexp under certain conditions, how should I report this?在某些情况下,正则表达式上的 PHP 段错误,我应该如何报告?
【发布时间】:2013-12-04 13:17:21
【问题描述】:

我有一个段错误的脚本。我将案例简化为以下内容:

// a very loooong string ---->
$string = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent mauris nibh, fringilla dapibus pharetra sit amet, cursus ut elit. Proin nulla nisl, accumsan at vulputate eu, elementum ac enim. Aliquam tortor lacus, ullamcorper sed purus ac, pulvinar euismod sem. Praesent euismod lacus et . Proin nulla nisl, accumsan at vulputate eu, elementum ac enim. Aliquam tortor lacus, ullamcorper sed purus ac, pulvinar euismod sem. Praesent euismod lacus et . Proin nulla nisl, accumsan at vulputate eu, elementum ac enim. Aliquam tortor lacus, ullamcorper sed purus ac, pulvinar euismod sem. Praesent euismod lacus et . Proin nulla nisl, accumsan at vulputate eu, elementum ac enim. Aliquam tortor lacus, ullamcorper sed purus ac, pulvinar euismod sem. Praesent euismod lacus et";
preg_match_all('/^(.)*$/', $string, $matches);

在这些情况下会出现段错误:

它在 Windows 上的 PHP5.3.x 和 PHP5.4.x 以及使用 Apache 时崩溃。

它在 Linux 上运行良好。它通过命令行(在 Windows 上)和 PHPUnit 运行良好。

如果您减少$string 的长度,它将运行良好。如果将正则表达式更改为 /^(?:.)*$/(非捕获),它运行良好。

所以我的猜测是我达到了某种极限。

pcre.backtrack_limit    1000000
pcre.recursion_limit    100000

我应该报告这个吗,如果是的话,如何/在哪里?


我可以通过更改正则表达式轻松解决问题,因此这对我来说不是什么大问题。段错误真的很烦人(难以调试,难以检测)

【问题讨论】:

  • 为什么要单独匹配每个字符?我认为你达到了极限。
  • 如果你认为这是一个错误,你可以在bugs.php.net报告它
  • @Haneev 这就是导致段错误的原因。我从一个更复杂(而且写得很糟糕)的正则表达式中减少了这个正则表达式。正则表达式的琐碎无关紧要,它不应该出现段错误。
  • @FritsvanCampen 同意。虽然很容易解释为什么 PHP 无法处理($matches 增长 方式 太大),但“无法处理”的方式是错误的。

标签: php regex segmentation-fault pcre


【解决方案1】:

检查bugs.php.net 以查看是否已报告类似问题。如果没有,请自己制作一个错误报告。看起来您对如何重现错误有很好的处理。

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多