通用代码审查清单整理
一、常规功能与可读性(P1+P2)
序号 | 审查项 | 判定标准(二元可验证) | 优先级 |
---|---|---|---|
1 | 功能实现完整性 | 代码覆盖所有预期需求点(对照需求清单无遗漏,无逻辑错误,如模板特化、重载函数功能符合设计) | P1 |
2 | 代码易懂性 | 新接手开发者可在 10 分钟内理解核心逻辑(无过度复杂模板嵌套、晦涩宏定义、无拼音 / 英文混杂命名) | P1 |
3 | 编码规范符合性 | 完全匹配团队 C++ 规范(如大括号位置、命名空间使用、const/constexpr正确修饰、缩进无违规) | P1 |
4 | 冗余代码清理 | 无重复代码(≥3 行相同逻辑未抽取为函数 / 模板)、无注释掉的无效代码块(如废弃的类成员、未使用的全局函数) | P1 |
5 | 循环安全性 | 循环有明确终止条件(无死循环风险),无循环内重计算(如重复获取std::vector长度),无迭代器失效场景(如循环中增删容器元素) | P1 |
6 | 全局变量 / 对象合理性 | 无不必要全局变量(可替换为局部变量 / 函数参数),全局对象无初始化顺序依赖风险(如跨文件全局对象相互引用) | P2 |
7 | 库函数 / STL 复用性 | 无自定义代码可被 C++ 标准库 / STL 替代(如手动实现容器遍历而非用std::for_each,手动内存拷贝而非用std::copy) | P2 |
8 | 调试代码清理 | 无残留日志(如std::cout/printf)、调试断点、临时测试代码(如未删除的main函数测试逻辑) | P2 |
二、安全合规(P1,全部高优先级)
序号 | 审查项 | 判定标准(二元可验证) | 优先级 |
---|---|---|---|
9 | 输入校验完整性 | 所有用户输入(接口参数 / 文件数据)完成类型、长度、范围校验(防缓冲区溢出、非法指针传入) | P1 |
10 | 第三方错误捕获 | 使用第三方库(如 Boost、数据库 SDK)时,所有可能的错误(返回码 / 异常)均被捕获处理(无未处理的std::exception子类) | P1 |
11 | 内存管理安全性 | 无内存泄漏(new/malloc分配的内存均有对应delete/free),无野指针(未初始化 / 已释放指针无访问) | P1 |
12 | 无效参数处理 | 函数接收无效参数(如nullptr、超出范围的枚举值)时,有明确容错逻辑(如返回错误码 / 抛指定异常,无崩溃) | P1 |
13 | 敏感数据保护 | 密码用哈希 + 盐值存储(无明文),敏感数据(如身份证号)传输 / 存储时用std::string加密处理,日志无敏感信息打印 | P1 |
14 | 指针 / 引用安全 | 无悬垂引用(引用已销毁对象),指针使用前均做非空判断(无nullptr解引用风险) | P1 |
三、文档完整性(P1+P2)
序号 | 审查项 | 判定标准(二元可验证) | 优先级 |
---|---|---|---|
15 | 核心注释有效性 | 复杂逻辑(如算法实现、模板特化规则)有注释,描述 “为什么做” 而非 “做了什么”(如解释const_cast使用原因) | P1 |
16 | 函数 / 类文档完整性 | 所有公共函数 / 类有注释(包含入参类型 / 出参含义 / 异常类型、模板参数约束、const成员函数语义) | P1 |
17 | 边界情况说明 | 代码处理边界场景(如空容器、极值输入、模板参数非法值)时,有注释说明设计意图(如 “此处需避免std::vector扩容开销”) | P2 |
18 | 第三方依赖文档 | 使用第三方库的关键接口(如数据库连接、网络通信)时,有注释标注库版本要求、接口限制(如 “仅支持 Boost 1.74+”) | P2 |
19 | 未完成代码标记 | 未完成代码(如待优化的模板实现)有TODO: [姓名] [日期] 描述清晰标记(如 “TODO: 2024-XX-XX 补充 constexpr 优化”) | P2 |
四、测试有效性(P1+P2)
序号 | 审查项 | 判定标准(二元可验证) | 优先级 |
---|---|---|---|
20 | 代码可测试性 | 无隐藏依赖(如硬编码文件路径、全局静态变量),支持单元测试初始化(如用 Google Test 可构造测试对象) | P1 |
21 | 单元测试覆盖度 | 核心业务逻辑(如支付处理、数据解析)单元测试覆盖率≥70%(用gcov等工具统计,含模板实例化场景) | P1 |
22 | 测试用例有效性 | 单元测试有明确断言(无 “空跑测试”),覆盖 C++ 特有场景(如异常抛出测试、模板参数非法值测试、内存泄漏检测) | P1 |
23 | 容器 / 数组安全测试 | 数组下标访问、容器迭代器操作有对应的越界测试用例(如std::vector的at()与[]边界测试) | P2 |
24 | 测试代码复用 | 无重复测试代码(≥3 行相同测试逻辑已抽取为测试工具函数 / 夹具,如 Google Test 的TEST_F共享初始化) | P2 |
五、可维护性(P2,中优先级)
序号 | 审查项 | 判定标准(二元可验证) | 优先级 |
---|---|---|---|
25 | 模块化设计 | 无 “万能类 / 函数”(类职责≤2 个,函数行数≤80 行),模板类 / 函数接口简洁(无过度复杂模板参数) | P2 |
26 | 配置集中管理 | 无硬编码配置(如数据库地址、端口号,统一存于配置文件 /constexpr变量,无分散的魔法数字) | P2 |
27 | 依赖合理性 | 类 / 函数依赖外部模块≤5 个(无过度耦合,如避免类继承链过长、减少friend类使用) | P2 |
28 | 异常信息清晰度 | 自定义异常(继承std::exception)包含关键上下文(如参数值、业务 ID),what()方法返回明确错误信息 | P2 |
29 | 析构函数完整性 | 有析构函数的类(尤其是含指针成员的类),析构函数无内存泄漏(如正确释放动态内存),虚基类析构函数为virtual | P2 |
30 | RAII 机制使用 | 资源(如文件句柄、锁、网络连接)通过 RAII 类管理(如用std::lock_guard而非手动加解锁,无资源泄漏风险) | P2 |
清单使用说明
审查流程:
- 提交者先自查(勾选 P1 项)→ 审查者重点核查 P1 项 + 随机抽查 30% P2 项 → 问题标记 “阻塞 / 非阻塞” → 修复后复核。
优先级应用:
- P1 项不通过则代码不可合并;P2 项可记录为 “后续优化项”,但需在迭代内闭环。
动态更新:
- 每季度统计 “高频问题项”(如某 P2 项连续 3 次出现),升级为 P1 项;无出现场景的项(如非支付业务的 “防重放攻击”)可暂存为 “可选项”。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.