php 多次递归传值出错,为什么PHP中的无限递归函数会导致segfault?

如果你使用XDebug,有一个最大的功能嵌套深度由一个

ini setting控制:

$foo = function() use (&$foo) {

$foo();

};

$foo();

产生以下错误:

Fatal error: Maximum function nesting level of ‘100’ reached, aborting!

这个IMHO是一个比segfault更好的选择,因为它只杀死当前脚本,而不是整个过程。

有几年前(2006年)在内部列表上有this thread。他的意见是:

So far nobody had proposed a solution for endless loop problem that

would satisfy these conditions:

No false positives (i.e. good code always works)

No slowdown for execution

Works with any stack size

Thus, this problem remains unsloved.

现在,#1是完全不可能解决由于halting problem.#2是微不足道如果你保持一个堆栈深度的计数器(因为你只是检查堆栈推送增加的堆栈级别)。

最后,#3是一个更难解决的问题。考虑到一些操作系统将以非连续的方式分配堆栈空间,所以不可能以100%的精度实现,因为不可能可移植地获得堆栈大小或使用(对于特定平台而言可能是可能的,甚至容易,但不是一般)。

相反,PHP应该从XDebug和其他语言(Python等)的提示,并使一个可配置的嵌套级别(Python的默认是set to 1000)….

或者,或者在堆栈上捕获内存分配错误,以检查segfault发生之前,并将其转换为RecursionLimitException,以便您可以能够恢复….

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值