代码审查技能
你现在具备进行全面代码审查的专业能力。请遵循以下结构化方法:
审查清单
1. 安全(关键)
检查项:
- 注入漏洞:SQL、命令、XSS、模板注入
- 认证问题:硬编码凭据、弱认证
- 授权缺陷:缺少访问控制、IDOR
- 数据泄露:日志/错误信息暴露敏感数据
- 密码学:弱算法、不当密钥管理
- 依赖项:已知漏洞(使用
npm audit、pip-audit等检查)
# 快速安全扫描
npm audit # Node.js
pip-audit # Python
cargo audit # Rust
grep -r "password\|secret\|api_key" --include="*.py" --include="*.js"
2. 正确性
检查项:
- 逻辑错误:Off-by-one、空值处理、边界情况
- 竞态条件:并发访问缺少同步
- 资源泄露:文件/连接未关闭、内存泄露
- 错误处理:吞异常、遗漏错误路径
- 类型安全:隐式转换、any 类型滥用
3. 性能
检查项:
- N+1 查询:循环中发起数据库调用
- 内存问题:大分配、引用保留导致无法释放
- 阻塞操作:异步代码里使用同步 I/O
- 低效算法:可以 O(n) 却写成 O(n^2)
- 缺少缓存:重复做昂贵计算
4. 可维护性
检查项:
- 命名:清晰、一致、可读
- 复杂度:函数 > 50 行、嵌套层级 > 3
- 重复:复制粘贴的代码块
- 死代码:未使用的导入、不可达分支
- 注释:过期、冗余,或该有却缺失
5. 测试
检查项:
- 覆盖率:关键路径是否覆盖
- 边界用例:空值、空集合、边界值
- Mock:外部依赖是否隔离
- 断言:是否有意义、足够具体
审查输出格式
## 代码审查:[文件/组件名]
### 概要
[1-2 句概述]
### 严重问题
1. **[问题]**(第 X 行):[描述]
- 影响:[可能的风险/后果]
- 修复:[建议的解决方案]
### 改进建议
1. **[建议]**(第 X 行):[描述]
### 正向反馈
- [做得好的地方]
### 结论
[ ] 可以合并
[ ] 需要小改
[ ] 需要大改
常见风险模式
Python
# 不推荐:SQL 注入
cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
# 推荐:
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
# 不推荐:命令注入
os.system(f"ls {user_input}")
# 推荐:
subprocess.run(["ls", user_input], check=True)
# 不推荐:可变默认参数
def append(item, lst=[]): # Bug:可变默认参数会在多次调用间共享
# 推荐:
def append(item, lst=None):
lst = lst or []
JavaScript/TypeScript
// 不推荐:原型污染
Object.assign(target, userInput)
// 推荐:
Object.assign(target, sanitize(userInput))
// 不推荐:使用 eval
eval(userCode)
// 推荐:不要对用户输入使用 eval
// 不推荐:回调地狱
getData(x => process(x, y => save(y, z => done(z))))
// 推荐:
const data = await getData();
const processed = await process(data);
await save(processed);
审查命令
# 查看最近变更
git diff HEAD~5 --stat
git log --oneline -10
# 查找潜在问题
grep -rn "TODO\|FIXME\|HACK\|XXX" .
grep -rn "password\|secret\|token" . --include="*.py"
# 检查复杂度(Python)
pip install radon && radon cc . -a
# 检查依赖
npm outdated # Node
pip list --outdated # Python
审查流程
- 理解上下文:阅读 PR 描述、关联的 Issue
- 运行代码:构建、测试,尽可能本地跑起来
- 自顶向下阅读:从主要入口开始
- 检查测试:变更是否有测试?测试是否通过?
- 安全扫描:运行自动化工具
- 人工审查:使用上面的清单逐项检查
- 撰写反馈:具体明确、给出修复建议、保持友好
