面试防线:AST 引擎如何防御超深层级嵌套的恶意公式导致的栈溢出

面试官提问
“如果有人输入了类似包含几千层嵌套括号的极端脏数据,你的递归下降算法会不会直接导致执行栈溢出(Stack Overflow),把前端浏览器搞挂掉?”

核心回答思路 (STAR法则)

  1. 业务痛点 (Situation)
    传统的递归下降解析器(Recursive Descent Parser)极其依赖函数调用栈。当公式树层级极端深时,调用栈必然爆破,导致浏览器直接白屏崩溃。

  2. 技术考量 (Task)
    为了工业级的健壮性,必须在入口处、解析中、执行时建立立体化的防崩溃体系。

  3. 架构决策 (Action)

  • 词法阶段 (Lexer) 的绝对限流:扫描阶段一旦识别出的总 Token 数量超过特定物理极限(如 2000 个),引擎直接短路抛出 FormulaTooComplexError。
  • Parser 的递归深度阻断针:在语法分析器的递归函数中硬编码注入 depth 参数。每次向下嵌套,depth + 1;一旦探测到 depth > MAX_SAFE_DEPTH (如100层),立即停止解析并抛出栈深超出异常。
  • 栈转换为迭代 (Trampoline 优化):对于核心的 AST 遍历求值阶段(Evaluate),将部分重度递归逻辑,利用“堆栈结构模拟”重写为非递归的 while 循环结构。将内存消耗从无法控制的系统调用栈转移到了可控的堆内存中。
  1. 业务价值 (Result)
    引擎具备了免疫任何形式脏数据轰炸的能力。在安全攻防演练中,完美抗住了千万级别的 Fuzzing 模糊测试,实现了真正的零崩溃底座。