解析器栈溢出:深层次嵌套的源代码导致 SIGSEGV 而不是 SyntaxError
作者: changjoon-park创建于 2026年4月22日更新于 2026年8月17日
□ 总结
解析深沉的Python源(brackets,parens等)会用SIGSEGV以~4000的入巢水平使解译器崩溃. CPython通过“语法错误:从剖析器的内部深度限制中划出太多的嵌入括号”将这个封入到200分。
相撞位于相撞器本身('rustpython-ruff python parser' 0.15.8):相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器 相撞器
这是被跟踪到的 第2796类bug的解析层根源. #4857也仍然在目前的干线上繁殖(2023年固定关闭).
□ 预期
匹配 CPython 3.13.4 行为 :
$ python3 - c “ 进口灰; ast.parse ('[' * 5000 + '1' +'' * 5000) ”
回溯( 最近最后一次通话) :
. . . . . . . .
语法错误: 太多嵌入式括号( "未知", 第1行)
(CPython的解析器在深度201通过硬码限制拒绝,早在本地堆栈用完之前.
□ 实际
$ rustpython -c “导入 ast; ast.parse ('[' * 5000 + '1' +''' * 5000) ”
[无输出,出站139号——SIGSEGV]
$ rustpython -c “src=' ['*5000+'1'+'] ” *5000; 编译(src,'s','exec')".
[无输出,出站139号——SIGSEGV]
##4857的原作复制人也依然崩溃:
$ rustpython -c “ 进口灰; ast.parse ('+chr (33)' * 1000000) ”
[无产出,出站139]
门槛
- 深度 *
编译()' * *ast.parse ()' * * |:也. 三千块,好,好,好 4000年,锡根格夫 15000 塞格格夫 塞克格夫 塞克格夫
相同的阈值确认崩溃是在解析器中,而不是在解析后转换中.
□ 与先前修正的关系
- #7630被守卫的QQast::ast from object ' (AST object → Rust IR转换).
- #7632通过
vm. with recursion'守卫json.loads()'。
两者均在剖析器下游生活. 剖析器本身的递归式下潜没有深度后卫,因此任何Python源被深层嵌入到括号中,parens,unary ops,或二进制上下潜,首先到达了原生堆栈限制.
□ 环境
- RustPython主@
5a45d41d'(parser:rustpython-ruff python parser'0.15.8) - 与:丙二酮 3.13.4
- macOS 15.1 / 达尔文 24.1.0
- Rust 释放建造
内容来源: RustPython/RustPython