编译器扫不出的"静默高危",XunOPC 替你抓住了。顺便聊聊:凭什么敢让它改生产代码。
在一次同模型、零人工介入的代码能力实测里,XunOPC 在一个真实项目 rxpro-vue-plus(583 个 Java、112 个 Vue、131 个 TS 文件)里翻到一处让人后背发凉的问题:JWT 签名密钥被硬编码成了框架的官方默认值。
这句话翻译成人话是:任何读过这个开源框架文档的人,都能拿默认密钥自己签一张 token,伪造成系统里的任意用户登录进来。它不报错、不崩溃、编译百分百通过——上线三年也可能一切"正常"。它就是那种最危险的雷:静默高危。
编译器扫不出的雷,靠深挖才抓得到
这次实测,我们坦率地说,对手腾讯 WorkBuddy 有它硬核的一面。它跑的是真实工具链:ESLint 扫出 15 个 error、用 compiler-sfc + esbuild 把 112 个 Vue 全部编译一遍、Maven 离线编译通过、甚至 javap 反编译确认新方法进了字节码。这套编译级验证闭环很扎实,尤其擅长揪出"CI 一定会挂"那类问题——比如它发现的模板解析错误(W4),就是构建必然失败的硬伤。
但编译器有它的盲区。能编译通过的逻辑雷和安全雷,它照样放行。JWT 默认密钥就是典型:语法合法、类型正确、跑得起来,唯独业务上是个后门。这种雷,得有人真的钻进后端一行行读源码才看得见。
XunOPC 这次派了 3 个并行探索代理分模块审了 826 个文件,逐条回到源码核实。它一共发现 14 项(3 高 / 7 中 / 4 低),明显偏后端:审批流状态机、定时任务一致性、token 生命周期、序列化器共享状态——还有这颗 JWT 密钥雷(O3)。修复方式也不含糊:把写死的密钥改成环境变量注入,让它不再躺在代码仓库里。
不止会挖,还会做工程判断。另一处高危 O2 里,定时任务重复生成了续签记录。XunOPC 没有简单粗暴地加个 @Transactional 了事——它先查基类,发现 doExecute 是 protected 方法,而声明式事务对 protected 方法和同类自调用都不生效,加了等于没加。于是它改用 TransactionTemplate 编程式事务,把插入续签记录和更新复制标记塞进同一个事务里。这一步,是读懂了框架机制才敢下的手。
凭什么敢让 AI 动手改生产代码
看到这里你可能会紧张:能挖雷是好事,可让一个 AI 直接改生产代码,谁给它兜底?
这正是 XunOPC 把"能力"和"边界"拧成一体的地方。它不是让你在"全自动放手"和"事事盯着"之间二选一,而是给了权限四档:
- 询问权限(推荐默认):每执行一个工具前都先问你一句;
- 接受编辑:自动批准文件改动,但命令和外部操作仍要问;
- 计划模式:只分析、只规划,一个字都不改;
- 跳过全部:风险最高,只留给边界清晰、可随时回滚的受控环境。
越自动的模式,越要求你事先划清边界——这是产品的立场,不是免责声明。
更关键的是那条硬线:付款、对外发布、合同、客户承诺、删除数据、修改访问控制这类不可逆动作,建议永远保留人工批准。自动化能替你提速,但不替你承担商业责任。所有待批准的申请会统一进入经营台的"决策收件箱",点一下就回到来源会话、带着完整上下文让你决定;真出了岔子,失败和超时的任务会落进"需要介入",不会悄无声息地烂在角落。
敢放手,是因为先有边界
改完之后你也不是只能听它一面之词。这次 XunOPC 一共动了 7 个文件(6 个 Java、1 个 yml),耗时约 5 分钟,全程 0 人工介入;它会明确告诉你改了哪些文件、修了哪些问题,并给出每个文件改动前后的 Diff,可以逐行审阅,也可以一键撤销当前修改。整段会话带着思考链、工具调用和时间戳,能完整回放——你随时查得清它每一步在想什么、动了什么。
我们也如实说清这次的遗留:XunOPC 的这 7 个 Java / yml 改动做的是静态复查(grep 核验保护调用、逐文件重读),尚未在 Maven 环境里编译验证,建议落地前补跑一次编译。这一次实测样本只有一个(n=1),不该外推成"XunOPC 永远更强"的普遍结论。
但这一次它确实做到了两件事:在别人扫不出的深处抓住了一颗静默高危,又把动手改代码这件事,牢牢关在人能随时叫停的边界之内。敢放手,是因为先有边界。对一个要独自扛起一家公司的人来说,这两件事缺一不可。