上周三晚上十一点,一个朋友发我消息,说他的项目刚上线三小时,服务直接崩了。
他排查到凌晨两点,最后发现问题出在一段「AI帮他生成的查询代码」上------循环里套了个没加限制条件的数据库查询,本地测试五条数据完全没问题,生产环境一跑,几千条数据直接把服务打趴下了。
他说了一句话我印象很深:「我以为AI比我严谨,没想到它比我还粗心。」
说实话,这种事我身边不止他一个。
用AI写代码这件事,大家现在基本上分两个阶段:
第一阶段,觉得AI是神,什么都敢往里扔,写完直接用;
第二阶段,被坑过一次之后,开始明白------AI生成的代码,跑通只是起点,能不能上线是另一回事。
我自己也踩过坑。今天这篇,就把我收集到的、程序员被AI代码坑得最惨的5个bug类型,一个一个说清楚,每个都附修复方案,最后给一个可以直接拿去用的校验清单。
🪤 坑一:边界条件像不存在一样
AI写代码有一个特点:它给你的往往是「教科书版本」的逻辑,也就是输入都合法、网络永远不断、用户不会乱操作的理想版本。
举个真实场景:
有人让AI写了一个解析用户上传文件的函数,逻辑很流畅,代码也很干净。但文件为空呢?文件格式不对呢?文件超过大小限制呢?
一个都没判断。
本地跑了个正常的文件,没问题,上线了。然后用户传了一个0字节的文件,直接报 NullPointerException,整个上传模块崩掉,还把后台日志刷成了红色。
修复思路:
每次拿到AI生成的函数,脑子里跑一遍:
- 入参为空/null/空字符串时,会发生什么?
- 列表为空时,会发生什么?
- 网络超时/接口返回错误时,会发生什么?
把这几个场景加进去,基本能堵住90%的边界问题。
javascript
// AI原版(没有任何边界处理)
function parseFile(file) {
const content = fs.readFileSync(file.path, 'utf-8');
return JSON.parse(content);
}
// 加完边界判断之后
function parseFile(file) {
if (!file || !file.path) {
throw new Error('文件对象无效');
}
if (file.size === 0) {
throw new Error('文件内容为空,请重新上传');
}
const content = fs.readFileSync(file.path, 'utf-8');
try {
return JSON.parse(content);
} catch (e) {
throw new Error('文件格式错误,请上传合法的JSON文件');
}
}
🐌 坑二:性能陷阱藏在看不见的地方
这个坑更隐蔽,因为它在本地完全没有症状。
最经典的一种:循环里查数据库。
AI写批量处理逻辑的时候,特别容易生成这种代码------遍历一个列表,列表里每个元素都查一次数据库,逻辑完全正确,但查询次数和数据量成正比。
数据量小的时候,没感觉。等到真实用户数据进来,一个请求发出去,后端发了一百多条SQL,响应时间直接从200ms变成20秒。
javascript
// AI生成版(N+1查询,数据量一大就崩)
async function getOrderDetails(userIds) {
const result = [];
for (const userId of userIds) {
const orders = await db.query('SELECT * FROM orders WHERE user_id = ?', [userId]);
result.push({ userId, orders });
}
return result;
}
// 正确版(一次查完,内存里分组)
async function getOrderDetails(userIds) {
const orders = await db.query(
'SELECT * FROM orders WHERE user_id IN (?)',
[userIds]
);
return userIds.map(userId => ({
userId,
orders: orders.filter(o => o.user_id === userId)
}));
}
review这类问题的习惯: 看到循环就问自己「这里有没有数据库操作或者网络请求」,有的话,基本就要改。
🔓 坑三:安全漏洞,AI不会主动告诉你
这是最严重的一类。
AI对安全问题的默认处理态度是:不处理。它给你一个能跑的方案,安全防护得你自己加。
最常见的两个:
1. SQL注入
python
# AI生成版(直接拼接字符串,典型的SQL注入漏洞)
def get_user(username):
query = f"SELECT * FROM users WHERE username = '{username}'"
return db.execute(query)
# 安全版(参数化查询)
def get_user(username):
query = "SELECT * FROM users WHERE username = ?"
return db.execute(query, (username,))
如果有人传入 username = "'; DROP TABLE users; --",第一种写法这个表就没了。
2. XSS(跨站脚本攻击)
前端项目里,AI经常生成 innerHTML = userInput 这种写法,看起来没问题,但你不知道用户会在输入框里塞什么内容。
javascript
// 有漏洞
container.innerHTML = userInput;
// 安全版
container.textContent = userInput;
// 或者用成熟的转义库处理富文本
凡是和用户输入相关的代码,一定要专门过一遍安全检查,别指望AI主动提示你。
🧱 坑四:业务逻辑全靠魔法数字撑着
这个坑当时不疼,三个月后会让你想哭。
AI写出来的业务逻辑,里面经常有一堆「魔法数字」------比如状态码直接写 if (status === 2),折扣直接写 price * 0.85,超时直接写 timeout = 30000。
这些数字是什么意思?2 代表什么状态?0.85 是哪个活动的折扣?30000 是哪个接口的超时?
代码里没有任何说明。
三个月后需求一变,你看着一堆裸数字,完全不知道哪个能改、哪个不能改,只能一行一行看逻辑、一个一个猜。
javascript
// AI版(魔法数字,半年后改不动)
function calcPrice(price, userType) {
if (userType === 2) {
return price * 0.85;
} else if (userType === 3) {
return price * 0.75;
}
return price;
}
// 可维护版
const USER_TYPE = {
NORMAL: 1,
VIP: 2,
SVIP: 3
};
const DISCOUNT = {
[USER_TYPE.VIP]: 0.85, // VIP会员九折
[USER_TYPE.SVIP]: 0.75, // SVIP会员七五折
};
function calcPrice(price, userType) {
const discount = DISCOUNT[userType] ?? 1;
return price * discount;
}
改动很小,但三个月后的你会感谢现在的你。
📄 坑五:注释和代码讲的不是同一件事
这个坑我觉得是最无语的。
AI写注释有时候是根据函数名「猜」逻辑写的,代码实现换了,注释还是老的。或者注释说「返回用户列表」,代码里其实返回的是分页对象,里面才有列表。
这类问题上线当时不会崩,但后续维护的人(可能就是一个月后的你)会被这些注释完全误导,在错误的方向上排查半天。
javascript
// 注释说返回boolean,代码里其实返回number状态码
/**
* 验证用户权限
* @returns {boolean} 是否有权限
*/
function checkPermission(userId, resource) {
// 实际上返回 0/1/2 代表不同权限等级
return db.getPermissionLevel(userId, resource);
}
检查方法很简单:生成完代码之后,单独让AI「对照代码重新生成注释」,别直接用第一次生成的。
✅ AI代码校验3步法(用完再提交)
说了这么多坑,给一个提交前可以直接用的检查流程:
第一步:边界 + 异常覆盖检查(2分钟)
- 函数入参为空时有没有处理?
- 异步操作有没有 try/catch?
- 列表操作前有没有判空?
第二步:性能热点扫描(1分钟)
- 循环内有没有数据库查询或网络请求?
- 大数据处理有没有分页或流式处理?
- 是否有不必要的重复计算?
第三步:安全敏感点过筛(2分钟)
- 用户输入有没有做过滤/转义?
- SQL查询有没有用参数化?
- 接口返回有没有暴露不该暴露的字段?
整套流程5分钟不到,能挡掉绝大多数上线前的定时炸弹。
写在最后
AI写代码这件事,我现在的态度是:用,但不完全信。
它是一个效率工具,不是一个质量保证。代码能跑是它的工作,代码能上线是你的工作。
这5类bug,是我收集到的大家被坑最多的场景。你踩过哪类,欢迎评论区聊聊。
我把完整的《AI写代码10条避坑清单+校验模板》整理好了,包含前端/后端/AI应用全场景的对照表,后台回复**「避坑」**直接发给你,复制就能用。
公众号关注 【iDao技术魔方】 ,每天一篇可落地的AI/前端实战干货。