求解器返回 SAT,表示给定约束存在一个满足条件的模型。它并不表示故障已经修复,更不表示补丁可以绕过测试直接热更新。把这些步骤混在一个fix()函数里,往往只得到一段返回成功的日志。
路径条件首先要写对
x > 0可满足,x <= 0也可满足;两者的合取才不可满足。真实程序里还要考虑整数溢出、浮点、外部状态和调用语义。求解模型若简化了这些行为,找到的输入可能无法重放,没找到也未必证明没有缺陷。
先从一个能解释完整边界的例子开始
以下是单变量整数区间约束的小求解器,只处理x > lower与可选的x <= upper。它不是通用符号执行引擎,却能把 SAT、见证输入与重放关系说清楚。
def integer_witness(lower_exclusive, upper_inclusive=None): if type(lower_exclusive) is not int: raise TypeError('integer bound required') if upper_inclusive is not None and type(upper_inclusive) is not int: raise TypeError('integer bound required') candidate = lower_exclusive + 1 if upper_inclusive is not None and candidate > upper_inclusive: return None return candidate witness = integer_witness(0) assert witness == 1 assert witness > 0 # Replay the path condition. assert integer_witness(0, 0) is None # x > 0 AND x <= 0. assert integer_witness(-3, 0) == -2 print({'positive_path_witness': witness, 'contradiction': integer_witness(0, 0)})这里的无解结论只适用于这类精确定义的整数区间。面对一般程序,路径覆盖、超时、未知返回值与求解失败都要分别记录;不能把“工具没有产出输入”统一写成 UNSAT。
重放成功以后仍有发布门禁
候选输入能稳定复现故障,才有了回归测试的起点。补丁需要同时跑原来失败的例子和正常路径,检查状态兼容、并发和回滚。若采用热补丁,还要验证目标进程版本、符号匹配以及不可回滚的状态变化。
2026年10月8日的 Agent 状态提案架构讨论强调把建议交给可审核的发布链。这里可以让助手提交候选输入、补丁与证据,执行权仍留在受控流水线。
本文只运行整数区间例子,没有执行 Z3、符号执行框架、补丁加载或真实服务回归。没有这些验证,就不应给出“纳秒定位、自动修复成功”的成绩。把每一步的产物与失败状态独立保存,反而更容易把一个研究工具接成可靠流程。