通过将原函数与AI补丁版在数千随机输入上对比,把旧实现作为预言机,绕过测试套件的盲区,发现代码审查看不出的回归问题。
AI 生成的补丁往往会破坏测试套件从未覆盖的行为,因为测试编码的是你对系统已有的假设。Differential fuzzing 通过在数千个随机输入上对比原函数和打补丁后的函数来绕过这一限制,让旧实现成为一个精确的 Oracle。将免费模型访问用于补丁生成、将免费服务器用于 fuzz 运行,这个 Gate 只需要几分钟就能建立起来,能捕获任何代码审查都无法发现的回归。
测试套件是一组经过人为选择的示例,而每一次选择都不可避免地在输入空间某处留下盲区。当 AI 模型重写一个函数时,它很容易改变没有任何测试覆盖的输入上的行为,而 diff 本身在评审者看来完全合理。模型不知道哪些行为是有意为之的,所以它优化的是它学到的模式,而不是你实际想要保留的契约。CI 通过只告诉你:这些被选中的示例仍然正常工作,这对于一个涉及 nontrivial 逻辑的补丁来说是一个微弱的保证。
不再问补丁是否通过了你的测试,而是问它在来自真实领域的大量输入样本上是否与原始实现行为一致。原始实现是你拥有的最精确的规范,因为它编码了所有在生产环境和用户反馈中存活下来的边界情况。生成随机输入,同时运行两个版本并比较输出;任何不匹配要么是故意的修复,要么是无意的回归,由你来决定是哪一个。
Disclosure: This article was prepared as part of MonkeyCode's product outreach.
使用 MonkeyCode 的免费模型访问生成候选补丁,并将其应用到免费服务器上的一个全新 worktree 中。
从 HEAD 创建一个包含原始代码的第二个 worktree,使两个版本共存而不互相干扰。
编写一个小的 fuzz harness,从一个感知领域的生成器中导入两个实现并向它们提供相同的随机输入。
运行 harness 指定迭代次数或时间预算,将所有不匹配收集到一份报告中。
将每个不匹配分类为:预期修复、无意回归或等效实现,然后做出合并决定。
免费服务器在这里很重要,因为 fuzz 运行是 CPU 密集型的且是一次性的,你不想让它与本地环境竞争或持久化任何状态。下面的脚本假设原始版本和打补丁版本都是纯函数,分别在 original.py 和 patched.py 中,两者都暴露了一个 process(data) 入口。
# diff_fuzz.py — compare two implementations on random inputs
import importlib.util
import random
import sys
def load(path, name):
spec = importlib.util.spec_from_file_location(name, path)
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
orig = load("original.py", "orig")
patched = load("patched.py", "patched")
def generate_input():
# Replace this with a generator that matches your domain
return random.randint(-10000, 10000)
def run(fn, data):
try:
return fn.process(data)
except Exception as e:
return f"EXC:{type(e).__name__}"
mismatches = 0
for i in range(int(sys.argv[1]) if len(sys.argv) > 1 else 10000):
data = generate_input()
o, p = run(orig, data), run(patched, data)
if o != p:
print(f"DIFF: {data} -> orig={o}, patched={p}")
mismatches += 1
if mismatches >= 10:
break
print(f"mismatches: {mismatches}")
在免费服务器上用 python diff_fuzz.py 50000 运行它,并将输出重定向到一个文件供后续检查。Harness 在十个不匹配后停止,因为前几个通常会揭示模式;如果差异稀疏或微妙,可以提高限制。
第三行是你需要在循环中保留人工的原因,因为返回 1.0 而不是 1 的补丁不是回归,而返回 -1 而不是 1 的补丁绝对是回归。Differential fuzzing 给你一个精确的行为变化列表,但它不会替你判断;判断是评审者的工作。
Differential fuzzing 只有在原始行为就是期望行为时才有效,这意味着对于没有先验实现可以对比的新功能来说它毫无用处。它也很难处理有副作用的函数,如数据库写入或网络调用,因为仅比较输出是不够的;你需要比较 resulting 系统状态。浮点数结果需要基于容差的比较,而随机生成必须匹配领域,否则 fuzz 运行将探索无关的空间。如果你的补丁是一个纯新增、你的代码库以 I/O 为主、或者你已经有了一个覆盖修改函数基于属性的测试套件,请跳过这种方法。
你的测试套件是一张你对预期情况的地图,而 AI 补丁是对测试套件无法完全描述的领域的改变。Differential fuzzing 让原始代码成为地图,而免费服务器是在不污染本地环境的情况下绘制它的正确场所。下次模型生成的 diff 进入你的队列时,在阅读 diff 之前运行 differential fuzz,因为不匹配会精确地告诉你该看哪里。
For further actions, you may consider blocking this person and/or reporting abuse