AI Code Review

支持多语言的AI代码审查,识别安全、性能、可维护性问题并提供修复建议。

已扫描
适合谁
软件开发工程师、技术负责人或团队主管
不适合谁
无编程基础的用户、仅需简单文本处理的用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @371166758-qq/qf-code-review

Skill 说明

命令、参数、文件名以原文为准

AI 代码审查

系统化的代码审查框架,涵盖安全漏洞、性能瓶颈、可维护性问题及主流编程语言的最佳实践。

描述

此技能提供一种类资深工程师的结构化代码审查方法。输出可操作、优先级明确的反馈,按严重程度(严重 / 警告 / 建议)和类别(安全 / 性能 / 可维护性 / 正确性 / 风格)组织。支持 Python、JavaScript/TypeScript、Go、Rust、Java 等常见语言。

何时使用

  • 审查拉取请求或代码提交
  • 部署前审计代码中的安全漏洞
  • 识别热点路径中的性能问题
  • 新成员入职时统一审查标准
  • 审查 AI 生成代码是否具备生产就绪条件

使用说明

审查流程

第一阶段:快速扫描(30 秒)

在深入分析前执行以下步骤:

  1. 理解意图:这段代码的作用是什么?阅读提交信息或 PR 描述。
  2. 检查范围:变更是否聚焦?是否涉及无关文件?
  3. 评估风险:是否修改了认证、支付、数据持久化或外部 API?标记为高风险。

第二阶段:按类别审查

安全性(🔴 若发现则为严重)

检查以下常见漏洞:

漏洞类型应关注的模式
SQL 注入查询中拼接字符串,未参数化的原始 SQL
XSS用户输入未转义即渲染到 HTML,使用 innerHTML 传入用户数据
路径遍历用户控制的文件路径,未对 ../ 进行过滤
硬编码密钥源码中直接包含 API 密钥、密码、令牌等敏感信息
不安全的反序列化使用 eval()pickle.loads()、对不可信数据调用 JSON.parse
IDOR(水平越权)资源访问接口缺少授权校验
命令注入使用 os.system()exec()subprocess 且参数来自用户输入
认证机制缺陷密码哈希强度不足、缺少速率限制、JWT 未验证

每项发现需明确:

  • 受影响代码位置
  • 攻击场景说明
  • 推荐修复方案并附代码示例
性能(🟡 若发现则为警告)

检查以下问题:

  • N+1 查询:循环内执行数据库查询
  • 无界操作:对用户可控数据大小的循环缺乏限制
  • 内存泄漏:未关闭连接、缓存无上限、事件监听器未移除
  • 低效算法:存在 O(n²) 场景却可用 O(n) 解决,不必要的数据拷贝
  • 同步阻塞:主进程或事件循环中进行文件 I/O 或 HTTP 请求
  • 缺少分页:加载完整数据集而非分页结果
  • 冗余计算:重复计算本可缓存的内容
正确性(🔴 若发现则为严重)

检查以下问题:

  • 边界错误:循环边界、索引计算、子串操作中的 off-by-one 错误
  • 空值处理缺失:解引用前未检查 null/undefined
  • 竞态条件:共享可变状态但未加同步
  • 错误处理不当:吞没异常、遗漏错误情况、捕获范围过宽
  • 边缘情况:空输入、负数、零、最大值、Unicode 字符
  • 类型不匹配:不同类型比较,隐式类型转换
可维护性(🟢 若发现则为建议)

检查以下问题:

  • 函数过长:超过 30 行的函数应考虑拆分
  • 复杂度过高:嵌套层级超过 3 层,参数列表超过 5 个
  • 命名不当:单字母变量(循环索引除外)、含义模糊的名称、命名不一致
  • 代码重复:可提取的重复逻辑
  • 死代码:未使用的导入、无法到达的分支、被注释掉的代码
  • 魔法数字:未经解释的数值常量

第三阶段:输出格式

按如下结构组织审查结果:

## 代码审查总结

**总体评估**: [可合并 / 需修改 / 请求修改]

### 🔴 严重(必须修复)
1. [类别] **标题**: 描述 + 位置 + 修复建议

### 🟡 警告(应修复)
1. [类别] **标题**: 描述 + 位置 + 修复建议

### 🟢 建议(可选优化)
1. [类别] **标题**: 描述 + 位置 + 修复建议

### ✅ 亮点
- 表扬做得好的地方(正向激励)

语言特定规则

Python:

  • 公共函数应添加类型提示
  • 推荐使用 pathlib.Path 而非 os.path
  • 资源操作应使用上下文管理器
  • 遵循 PEP 8 行长度规范(Black 为 88 字符,flake8 为 79 字符)

JavaScript/TypeScript:

  • 默认使用 const,仅在需要重新赋值时使用 let
  • TypeScript 中对象结构推荐使用 interface 而非 type
  • 避免使用 any — 改用 unknown 并通过类型守卫缩小范围
  • 优先使用可选链(?.)和空值合并(??)替代手动判断

Go:

  • 显式处理错误 — 严禁使用 _ = err
  • 函数长度控制在 50 行以内
  • 使用表格驱动测试
  • 接收接口,返回结构体

示例

发现示例:

🔴 严重 [安全] 用户登录中的 SQL 注入
位置: src/auth/login.py:42
`username` 参数直接拼接到 SQL 查询中:
  cursor.execute(f"SELECT * FROM users WHERE username='{username}'")
修复:使用参数化查询:
  cursor.execute("SELECT * FROM users WHERE username = %s", (username,))

建议示例:

🟢 建议 [可维护性] 提取魔法数字
位置: src/utils/cache.py:18
数字 86400 未加说明,代表一天的秒数。
修复:定义为命名常量:
  CACHE_TTL_SECONDS = 86_400  # 24 小时

技巧

  • 审查差异部分,而非整份文件 — 聚焦于实际变更内容
  • 始终检查变更代码的测试覆盖率
  • 先使用自动化工具(lint 工具、类型检查器、安全扫描器)—— 人工审查应补足工具遗漏的部分
  • 提出修改建议时,提供修复后的代码,而不仅是描述
  • 严格区分严重等级 — 将所有问题都标为“严重”会削弱真正严重问题的警示作用
3Q
@371166758-qq

已收录 1 个 Skill

相关推荐