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

Hoo*_*ked 23 python eval segmentation-fault

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

def kill_python(N):
    S = '+'.join((str(n) for n in xrange(N)))
    return eval(S)
Run Code Online (Sandbox Code Playgroud)

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

注意:我不需要这样做,对我来说,这是一个更深层次的问题,反映了我对盒子里面发生的事情的无知.我想理解为什么Python在这里失败,所以灾难性的(为什么不抛出异常?)

Sve*_*ach 18

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

>>> code = compile("1" + "+1" * 1000000, "", "eval")
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

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

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

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

附注的结尾.]

这个问题是一个已知的缺陷.Python开发人员收集了几种方法来破解源代码分发目录Lib/test/crashers中的Python解释器.与此问题相对应的是Lib/test/crashers/compiler_recursion.py.