一位开发者在个人项目里顺手让AI写了几行代码,结果一头栽进了为期数周的代码审计深渊。他原本只是想偷懒,最后却对着1000多行机器生成的代码逐行排查——不是为了找bug,而是为了看清AI到底在没人盯着的时候,会偷偷埋下什么。
从"工具使用者"变成"标本收集者"
Hussain Shamlooh的实验开始得很随意。ChatGPT、GitHub Copilot(代码自动补全工具)、还有几个想尝鲜的竞品,同时开在不同标签页。他本打算让AI帮忙搭个练手项目,但很快换了思路:如果故意给这些工具出不同的题、换不同的语言、设置不同的陷阱,它们会交出什么样的答卷?
他像收集蝴蝶标本那样收集代码片段。同一道题扔给三个工具,输出摆在一起对比;故意在需求里埋歧义,看AI会不会追问;要求生成"能跑就行"的代码,再检查里面藏了多少债务。一千行代码读下来,他发现恐惧的从来不是AI写不出东西,而是它写得太像那么回事了。
第一个陷阱:自信满满的幻觉代码
Shamlooh最频繁遇到的,是AI对"不确定"的零容忍。遇到模糊需求,人类程序员会停下来确认,但生成式模型会径直编造——而且编得流畅自然。他记录了一个典型案例:要求生成调用某第三方API的代码,AI直接输出了看似合理的端点地址和参数结构,实际上全是假的,API文档里根本没有这些字段。代码能编译,运行时报错,调试时才发现AI在假装懂这个接口。
这种"幻觉"在涉及具体版本号、配置参数、甚至函数名时反复出现。AI不会说"我不确定",它会选一个概率上最像答案的组合,用正确的语法包装成确定性输出。对新手来说,这几乎是无法识别的陷阱——代码风格专业,注释写得诚恳,唯一的问题是根本跑不通。
第二个陷阱:安全漏洞的"合法化"包装
更隐蔽的风险在安全领域。Shamlooh发现,AI生成的代码里,危险模式往往被包裹在"常见做法"的外衣下。SQL拼接、不安全的反序列化、硬编码密钥——这些人类代码审查中会被标红的问题,AI写出来时附带的是"简化示例"或"快速实现"的注释,仿佛在说:这只是demo,别当真。
但问题是,没人会把demo当demo用。他追踪的一段用户认证代码,AI为了"让示例更完整",生成了一套包含密码哈希的登录流程。用的却是已经被淘汰的MD5算法,而且盐值固定写死在代码里。对初学者而言,这段代码看起来比教程还贴心;对攻击者而言,这是现成的突破口。
第三个陷阱:技术债务的复利效应
最让Shamlooh后背发凉的,是AI对"可维护性"的系统性忽视。他对比了同一功能的人工实现和AI实现:后者往往多30%的行数,依赖更复杂的嵌套结构,变量命名遵循某种概率分布而非语义逻辑。单独看每一段都能跑,但三个月后回头修改,连原作者自己都会迷路。
这不是AI的恶意,是训练数据的回声。开源代码库里,能跑但丑陋的实现远多于优雅的设计,AI学会了模仿多数派的写法。当开发者用AI加速开发,实际上是在批量引入"明天会后悔"的决策。债务不会消失,只是被机器以工业速度复利累积。
审计之后的冷思考
Shamlooh的实验没有给出"用或不用"的二元答案。他的结论是:AI代码审查需要新的肌肉记忆——不能只看跑没跑通,要追问"它为什么这么写";不能信任注释里的谦虚声明,要验证每一个外部依赖;不能把AI当成结对编程的搭档,要把它当成一个语速极快、从不承认自己不懂的实习生。
他最后留下一个问题给同行:当你的代码库里有30%、50%、或者80%的AI生成内容时,你的审查流程准备好了吗?还是说,你只是在用昨天的方法,检查明天的债务?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.