为什么python的eval有长度限制?

时间:2012-07-24 16:23:56

标签: python segmentation-fault eval

我并不是说这会是一个好主意,但我发现你可以通过在足够大的输入字符串上运行eval来崩溃Python(2.7和3.2检查):

def kill_python(N):
    S = '+'.join((str(n) for n in xrange(N)))
    return eval(S)

在我的计算机上S可以很好地生成,但对于大约N>74900的值,Python将失败并显示Segmentation fault (core dumped)。解释器可以处理的字符串(或解析树)的长度是否有限制?

注意:我不需要这样做,对我而言,这是一个更深层次的问题,反映了我对框内内容的无知。我想理解为什么Python在这里失败,所以灾难性的(为什么不抛出异常?)

1 个答案:

答案 0 :(得分:18)

此问题是由CPython编译器中的堆栈溢出引起的。重现同样问题的简便方法是

>>> code = compile("1" + "+1" * 1000000, "", "eval")
Segmentation fault

证明了段错误发生在编译阶段,而不是在评估过程中。 (当然这也很容易用gdb确认。)

[旁注:对于较小的表达式,编译器无论如何都会在此处应用常量折叠,因此在执行代码期间发生的唯一事情就是加载结果:

>>> code = compile("1" + "+1" * 1000, "", "eval")
>>> eval(code)
1001
>>> dis.dis(code)
  1           0 LOAD_CONST            1000 (1001)
              3 RETURN_VALUE        

旁注结束。]

此问题是known defect。 Python开发人员收集了几种方法来破解源代码分发的directory Lib/test/crashers中的Python解释器。与此问题相对应的是Lib/test/crashers/compiler_recursion.py