AI6 min read
用 AI 做代码审查:效率提升 5 倍的实践
用 AI 做代码审查:效率提升 5 倍的实践
AI编程代码审查Claude最佳实践
代码审查是保证代码质量的关键环节,但人工审查耗时且容易遗漏。AI 可以作为第一轮审查,大幅提升效率。
为什么用 AI 做代码审查?
人工审查的痛点
- 审查者时间有限,容易草率
- 容易遗漏安全漏洞和边界情况
- 不同审查者标准不一致
- 大量 PR 积压
AI 审查的优势
- 24/7 可用,即时响应
- 能发现隐藏的 bug 和安全问题
- 标准一致
- 不会疲劳
如何用 AI 审查代码
方法 1:直接粘贴代码
审查以下 Java 代码,重点关注:
1. 空指针风险
2. 并发安全
3. SQL 注入
4. 性能问题
5. 代码规范
[粘贴代码]
方法 2:用 Claude Code
# 审查最近一次 commit
claude > 审查最近一次 git commit 的代码
# 审查特定文件
claude > 审查 src/service/OrderService.java
# 审查整个 PR
claude > 对比 main 分支和当前分支的改动,审查所有变更
方法 3:GitHub PR 集成
使用 Claude 的 GitHub 集成,在 PR 上自动评论:
# .github/workflows/ai-review.yml
name: AI Code Review
on: [pull_request]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: anthropics/claude-code-action@v1
with:
anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
审查 Prompt 模板
通用审查
审查这段代码,从以下角度:
1. 正确性:逻辑是否正确
2. 安全性:有无漏洞
3. 性能:有无瓶颈
4. 可维护性:代码是否清晰
5. 边界情况:是否处理了异常输入
对于每个发现,给出严重程度(高/中/低)和具体修复建议。
安全审查
对这段代码进行安全审查,重点检查:
1. SQL 注入
2. XSS 攻击
3. CSRF 防护
4. 敏感信息泄露
5. 权限校验缺失
6. 文件上传漏洞
给出 OWASP Top 10 相关的安全建议。
性能审查
审查这段代码的性能问题:
1. 数据库查询是否高效
2. 是否有 N+1 查询
3. 缓存使用是否合理
4. 是否有内存泄漏风险
5. 并发性能如何
给出具体的优化建议和代码示例。
Java 专项
审查这段 Java 代码,遵循以下规范:
- Google Java Style Guide
- SOLID 原则
- Spring Boot 最佳实践
重点关注:
1. 异常处理是否合理
2. 资源是否正确关闭
3. 线程安全
4. Optional 使用
5. Stream API 使用是否恰当
实际案例
案例 1:发现空指针风险
AI 输入:
public String getUserName(Long userId) {
User user = userRepository.findById(userId);
return user.getName();
}
AI 输出:
问题:高 - 空指针风险
findById 可能返回 null,直接调用 getName() 会 NPE。
修复:
public String getUserName(Long userId) {
return userRepository.findById(userId)
.map(User::getName)
.orElse("Unknown");
}
案例 2:发现 SQL 注入
AI 输入:
public List<User> searchUsers(String keyword) {
String sql = "SELECT * FROM users WHERE name LIKE '%" + keyword + "%'";
return jdbcTemplate.query(sql, new UserRowMapper());
}
AI 输出:
问题:高 - SQL 注入
直接拼接用户输入到 SQL 中,存在注入风险。
修复:
public List<User> searchUsers(String keyword) {
String sql = "SELECT * FROM users WHERE name LIKE ?";
return jdbcTemplate.query(sql, new UserRowMapper(), "%" + keyword + "%");
}
案例 3:发现并发问题
AI 输入:
public void deductStock(Long productId, int quantity) {
Product product = productRepository.findById(productId);
if (product.getStock() >= quantity) {
product.setStock(product.getStock() - quantity);
productRepository.save(product);
}
}
AI 输出:
问题:高 - 并发安全
非原子操作,高并发下可能超卖。
修复:使用乐观锁或悲观锁
@Lock(LockModeType.PESSIMISTIC_WRITE)
Product findByIdWithLock(Long id);
或使用 CAS:
@Modifying
@Query("UPDATE Product p SET p.stock = p.stock - :qty WHERE p.id = :id AND p.stock >= :qty")
int deductStock(Long id, int qty);
AI 审查的局限
- 不能替代人工审查:AI 是第一轮,人是最终审查
- 可能误报:AI 可能标记不是问题的代码
- 不了解业务:AI 不知道业务逻辑是否正确
- 不能运行代码:AI 只能静态分析
最佳实践
- AI 先审,人后审:AI 做第一轮过滤,人做最终决策
- 定制 Prompt:根据项目规范定制审查标准
- 持续优化:根据审查结果优化 Prompt
- 结合 CI/CD:集成到 PR 流程自动审查
- 记录常见问题:建立团队的代码审查清单
总结
AI 代码审查的价值:
- 减少低级 bug:空指针、SQL 注入、资源泄漏
- 提高审查效率:AI 过滤明显问题,人关注架构和业务
- 统一标准:AI 审查标准一致
- 加速 PR 合并:减少审查等待时间
AI 不替代审查者,但能让审查者专注于更重要的事情。