ProgramBench Vetted 这套基准出来前
之前测过几轮,不管是 GPT-4 还是 CodeLlama,扔个 strip 掉符号表的 ELF 过去,要么给我编个漏洞利用脚本出来,要么把汇编指令当伪代码硬翻,根本跑不通。ProgramBench 早期版本也就是语法层面的匹配,离实际工程场景十万八千里。
这次 Vetted 版本最大的变化,不在模型端,而在数据清洗和评测闭环上。他们没单纯追求样本量,而是把「可运行」做成了硬门槛:每个样本都是完整编译工具链产出的二进制,保留编译器优化痕迹、标准库链接噪音、甚至随机化地址布局带来的副作用。再配上一套基于功能等价的动态执行判分 —— 输入输出一致、副作用一致、系统调用序列一致,才算过。
这直接把「看起来像」和「跑得动」切开了。
我拿里面的 reversing-hard 子集跑了下 Claude 3.5 Sonnet 和 DeepSeek-Coder-V2,有几个观察值得记下来:
- 控制流恢复依然是短板
-O2 甚至 -O3 下的尾调用消除、循环展开、基本块重排,模型生成的伪代码控制流图(CFG)准确率不到 42%。最典型的是 switch-case 被降级成跳转表后,模型死活写不出 switch 语法,全是 if-else 链,语义对但可读性全无。- 标准库识别靠幻觉
memcpy、printf 这种 libc 函数全靠模型「认指令特征」。Vetted 里专门混入了 musl 和 glibc 不同版本的二进制,模型经常把 musl 的内联实现当成业务逻辑去分析,导致变量命名、参数推断全链路崩。- 动态执行判分救了大命
for(;;) 和 while(1) 判不等,动态跑一遍直接过。但这也引入新坑:未定义行为(UB)触发时,原程序和生成代码可能「巧合」输出一致,判分器得加 sanitizer 跑多轮种子才稳。- 上下文窗口还是物理瓶颈
Vetted 版本开源的评测脚本里内置了 Docker 沙箱,docker run --rm -v $(pwd):/data programbench/vetted:latest /data/test.bin /data/pred.c 一条命令出分数,省去了自己搭环境踩坑。想做二进制分析 Agent 的,建议先跑通这个基线,别上来就造轮子。
事件追踪 · 相关报道
让大模型通过自我访谈来反向工程自己的运行逻辑这招真的绝了
9天前
免费 AI 工具箱 · 全部完全免费