AI代码审查(CodeReview)清单标准版

内容分享5小时前发布
4 0 0

合并请求被拒了,缘由不是格式问题,而是代码里的逻辑链没被人反复过一遍,有漏洞也没被发现。

审查的人给出的理由很直白:别光看着代码“美丽”就点通过,AI 帮你改的东西,哪怕看起来语法全是对的,功能上也可能有隐蔽的漏洞。换句话说,审查的重心要从“样式对不对”变成“逻辑是不是站得住脚”。这不是挑毛病,这是为了别把问题带到主分支上,或者更糟糕,把隐患留给生产环境和用户来替我们发现。

把这个清单直接放到代码库的合并请求模板里,是个务实的做法。这样每次有人提交 MR,大家的注意力就从“格式风格”往“是否真实可用”转移。传统的代码评审习惯盯着变量名、缩进、注释对不对,但面对 AI 生成的改动,审查要问的东西完全不同:它写的是功能,功能是不是有前置条件?边界情况有没有覆盖好?出错了怎么处理?这些问题都要逐条写清楚。

先把变更要解决的意图和具体使用场景重新讲一遍,把所有假设条件列出来。什么输入是被允许的?哪些输入是异常?API 的边界在哪里?每一个返回值代表什么意思?如果审查时连这些基本问题都回答不上来,那就别合并。最好提交者在 MR 描述里把这些都写明,像写合同一样清楚。合同里要写清楚:如果调用方违约,会发生什么——是抛错、返回默认值还是静默失败?这些行为都必须可预测。

具体要检查的点,可以把范围细化为一条条可以验证的清单,别只靠肉眼看代码就完事。包括但不限于:

– 把变更的目标和场景再复述一遍,列出隐含假设;

– API 的输入边界、允许的值域和非法输入的处理方式;

– 返回值的语义解释,以及调用方应该如何判断成功或失败;

– 错误处理流程:哪些错误会上报,哪些会被吞掉,是否有重试或降级机制;

– 并发场景下的竞态条件、锁策略、可能的死锁或丢失更新风险;

– 外部依赖的版本和兼容性,第三方库是否有已知漏洞;

– 对敏感数据的处理是否安全,日志里有没有可能泄露机密;

– 异常路径是否有兜底方案,列如 I/O 失败、网络超时、服务不可用时的降级流程。

这些点看起来琐碎,但每一项都能把一个“看着没毛病”的改动拆开来检验。有些问题只有在跑了极端用例时才会显现,列如遇到超长输入、空值、错误编码格式、不规则序列化、数据库返回异常状态等等。给每一个关键分支配备测试用例:常规路径、边界值、异常路径和压力场景都得涵盖。单元测试绿灯不等于就没问题,集成测试和端到端测试也要跑,特别是涉及跨服务调用时。

安全优先级要最高。AI 生成的改动很容易在没注意的地方引入安全漏洞。一个简单的检查方法是把外部输入从进来到被消费的每一步都追一遍,问一句:这里做了鉴权吗?做了校验和消毒吗?有没有把敏感字段写进了日志或外部系统?有没有反序列化任意类型的风险?这种低级但致命的问题,看着可能不会立刻出错,但一旦有人利用,代价很高。

每条分支都该对应至少一条测试用例。审查者不要只看 diff,要跑测试。最好的做法是要求提交者在 MR 里附上复现脚本或示例请求,能在本地或 CI 上快速复现。涉及性能方面的改动,还要给出基准数据和测试环境信息,别让“我机器上能跑”当作评判标准。数据库或迁移操作必须配上回滚脚本和数据校验脚本,任何可能改变历史数据的事情都要有回滚路径和数据一致性校验办法。

另一个常被忽视的地方是异常声明和文档。许多 AI 自动生成的函数没有把前置条件、边界条件写进注释或接口规范。把接口当合同来读:如果调用方违约,系统会怎样?这些会不会导致沉默失败或隐蔽的数据损坏?日志是否包含足够的上下文,便于追踪问题?这些点要写清楚,而且审查时就要能在代码里找到对应的处理。

实操上,审查人员需要准备一套“追问清单”,当遇到不确定问题就用这些问题逼提交者给出证明。可以问的例子包括:

– 能不能给出一个最小可复现的示例?

– 在 X 边界条件下,函数会返回什么?

– 外部服务超时时,流程如何继续?有没有降级或补偿逻辑?

– 并发写入时有没有竞态保护?有没有可能出现丢失更新?

– 所有外部输入在哪一步被校验或清洗?有没有遗漏?

– 依赖的第三方库具体版本号是多少?是否有已知漏洞?

– 变更会不会影响历史数据兼容性?回滚方案是什么?

这些问题看着直白,但能把许多隐藏的风险扯出来。

为了减少来回折腾,把审查流程标准化、写成模板。MR 的描述里强制包含这些项:意图描述、假设清单、关键函数列表、边界测试用例、回滚方案、性能基准、监控指标。提交者必须填好再发起合并请求,这样责任链条明确,审查者也有据可查。长期下来还能把一些常见错误模式积累成知识库,避免重复踩坑。

在测试覆盖上,对 AI 生成的逻辑要加大力度覆盖边界 case:空值、超长输入、异常返回码、不规则序列化格式、跨进程或跨服务的一致性问题都要思考进去。单测只是第一步,集成和压力测试是揭示问题的关键。有条件的话,把测试放到 CI 的不同阶段,分层跑,确保改动在不同环境下的行为一致。

审查的心态也要改。不要由于代码“看着没问题”就点通过。LGTM 只有在你能解释清楚每一个分支的行为时才算数。对 AI 写的改动,尤其要要求提交者亲自验证那些你在代码里看不到的假设:列如外部服务总是会返回某字段、或者某个接口永远不会超时。把“看着像对的”变成“能复现实验/能证明是对的”。

最后,遇到不确定的情况,直接把一组具体问题发回去,让提交者去验证:

– 最小可复现示例放在哪儿?

– 异常、超时、并发场景下的输出是什么?

– 用来判断正确性的指标和测试数据是什么?

– 回滚步骤和数据修正脚本在哪里?

– 外部依赖的确切版本和已知问题在哪里?

– 敏感数据有没有做额外保护?

这些问题不是为了刁难,是逼大家把责任扛起来,不要把风险留给运维和用户去背。

© 版权声明

相关文章

暂无评论

none
暂无评论...