cpp-code-review/SKILL.md
对 C++ Windows 客户端项目进行深度代码审查。涵盖安全性、资源管理、字符串编码、 内部公共库使用合规性、可测试性设计、并发安全、Google C++ 规范、Windows 平台特有问题 及性能等维度。适用于 PR 审查、模块上线前检查、技术债务梳理等场景。
npx skillsauth add spursgo/real-self-skills cpp-code-reviewInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
对当前工作区的 C++ 代码进行系统性深度审查。采用 逐项 Checklist 模式:每完成一项检查立即汇报结果,最终输出汇总报告。
.h/.hpp/.cpp/.cc)按 P0 → P7 优先级顺序,逐项执行以下 Checklist。每完成一项检查,立即输出该项的检查结果。
每项检查结果使用以下格式实时输出:
- [x] **S1 缓冲区溢出** — PASS(未发现问题)
- [ ] **S2 整数溢出与截断** — FAIL
- CRITICAL `src/parser.cpp:42` — `size_t` 强转 `int` 可能截断,当文件大于 2GB 时导致未定义行为
- WARNING `src/utils.cpp:88` — 无符号与有符号比较,建议统一为 `size_t`
- [-] **S5 数据竞争** — N/A(模块为单线程,无并发场景)
结果标记说明:
[x] PASS — 检查通过,未发现问题[ ] FAIL — 发现问题,紧跟问题列表(每条注明严重级别 + 位置 + 描述)[-] N/A — 该检查项不适用于当前代码(说明原因)严重级别定义:
CRITICAL — 必须修复:安全漏洞、崩溃风险、数据损坏WARNING — 建议修复:潜在风险、不符合规范、可维护性问题INFO — 改进建议:优化空间、代码风格、最佳实践[ ] S1 缓冲区溢出
检查数组越界访问、memcpy/wcscpy/sprintf 等不安全函数,建议替换为 _s 安全版本或 STL 容器
[ ] S2 整数溢出与截断
size_t 与 int 混用、有符号/无符号隐式转换、算术溢出未检查
[ ] S3 资源泄漏 HANDLE、HKEY、GDI 对象、COM 接口、堆内存是否全部通过 RAII 包装管理
[ ] S4 空指针与悬垂指针 裸指针生命周期是否清晰,应该使用智能指针的场景是否遗漏
[ ] S5 数据竞争(Data Race) 多线程访问同一变量且至少一方为写操作时,是否缺少同步保护(mutex、atomic、SRWLock 等)。数据竞争是 C++ 未定义行为,可导致崩溃或数据损坏
[ ] S6 锁使用安全
是否使用 RAII 锁守卫(std::lock_guard/std::unique_lock/CAutoLock)而非手动 lock()/unlock();是否存在异常或提前 return 导致的未解锁路径;多锁场景加锁顺序是否一致以避免死锁
[ ] S7 线程安全的对象生命周期
异步回调、线程任务捕获的对象(this、裸指针、引用)在回调执行时是否仍然存活;跨线程传递 shared_ptr/weak_ptr 是否正确(weak_ptr::lock() 后检查有效性)
[ ] S8 共享容器与迭代器失效 STL 容器在一个线程迭代的同时另一个线程增删元素,导致迭代器失效和崩溃;是否对共享容器的所有读写路径加锁或使用线程安全的拷贝策略
[ ] S9 线程间通知与状态同步
使用条件变量(std::condition_variable)或事件(CreateEvent)时,是否存在虚假唤醒未处理(wait 缺少谓词)、通知丢失(notify 在 wait 之前)、或忙等待(while 循环无 sleep/wait)等问题
[ ] E1 wstring 优先
是否优先使用 std::wstring(UTF-16);std::string 是否明确为 UTF-8
[ ] E2 Windows API W 版本
是否统一调用 W 后缀版本(CreateFileW),禁止使用 A 版本和 TCHAR 宏
[ ] E3 编码转换正确性
使用公共库进行编码转换时,EncodeHelper::Unicode2Utf8/Utf82Unicode 参数是否正确
[ ] E4 字符串混编
是否存在 wstring 与 string 混用拼接、隐式转换丢失数据的风险
[ ] L1 禁止重复造轮子
功能是否已有公共库实现(网络、日志、加密、IPC 等),对照 internal_public_lib skill 的能力路由表检查
[ ] L2 禁止私自引入第三方库 是否引入了未经批准的第三方依赖
[ ] L3 CMake 链接规范
CMakeLists.txt 中是否误手动链接公共库 .lib(应由 #pragma comment(lib) 自动处理),CMake 只负责 include 路径和 link directories
[ ] L4 日志输出规范 日志是否输出到模块所在目录,文件名是否与模块名一致
[ ] T1 依赖注入 业务逻辑层是否直接依赖单例/全局状态;是否通过接口进行构造函数注入
[ ] T2 接口隔离 单个接口职责是否单一;如果 Mock 对象超过 3 个,说明需要拆分
[ ] T3 Humble Object UI/IO 层是否拆分为薄壳(纯转发)+ 可测试的逻辑对象
[ ] T4 CQS 原则 查询方法是否有副作用,命令方法是否返回了不该返回的数据
[ ] T5 测试覆盖
关键业务逻辑是否有对应单元测试,测试是否遵循 AAA 模式和 Action_Condition_Expected 命名
[ ] C1 RAII 全覆盖 所有系统资源(HANDLE、锁、COM、文件)是否通过 RAII 包装
[ ] C2 锁粒度与并发度 锁的保护范围是否过大(降低并发度)或过小(遗漏保护);是否可用读写锁替代互斥锁提升并行读性能;是否有不必要的全局锁可拆分为细粒度锁
[ ] C3 COM 线程模型
CoInitializeEx 的 apartment 模型(STA/MTA)是否与使用场景匹配
[ ] C4 线程池与任务调度 线程创建是否合理(避免频繁创建销毁),是否应使用线程池;异步任务是否有合理的取消/超时机制
[ ] G1 命名风格
类名 PascalCase、函数 PascalCase、变量 snake_case、成员变量 snake_case_、常量 kPascalCase、枚举值 kPascalCase
[ ] G2 头文件规范
include 顺序(对应 .h → C 库 → C++ 库 → 其他库 → 本项目)、#pragma once 使用
[ ] G3 auto 使用
auto 仅在类型显而易见时使用,避免降低可读性
[ ] G4 namespace
禁止 using namespace 污染头文件,源文件中也应谨慎使用
[ ] G5 异常策略 是否与项目异常策略一致(Google 风格默认不用异常)
[ ] G6 const 正确性
不修改的参数、成员函数、局部变量是否标记为 const
[ ] W1 API 返回值检查
Win32 API 返回值是否检查,GetLastError 是否在第一时间获取(中间不能插入其他 API 调用)
[ ] W2 注册表 WOW64
注册表操作是否正确处理 32/64 位重定向(KEY_WOW64_64KEY/KEY_WOW64_32KEY)
[ ] W3 进程/窗口通信
消息机制(SendMessage/PostMessage/命名管道等)是否存在竞态或消息丢失
[ ] W4 版本兼容 是否依赖了特定 Windows 版本的 API,是否有运行时版本检查或降级方案
[ ] W5 路径处理
路径长度是否考虑 MAX_PATH 限制,是否使用 \\?\ 前缀处理长路径
[ ] W6 绝对路径 访问本地文件必须使用绝对路径,禁止使用相对路径;相对路径依赖进程当前工作目录(CWD),在服务、计划任务、快捷方式等场景下 CWD 不可预期,易导致文件找不到或误操作错误目录
[ ] F1 不必要的拷贝 热路径是否有不必要的内存分配或深拷贝,大对象是否通过移动语义或引用传递
[ ] F2 字符串临时对象
字符串拼接是否频繁创建临时对象,是否可以用 reserve/append 优化
[ ] F3 虚函数开销 性能敏感路径是否有不必要的虚函数调用
[ ] F4 容器选择
数据结构选择是否合理(vector vs list vs unordered_map)
[ ] F5 I/O 效率 文件/网络 I/O 是否在 UI 线程执行导致卡顿
所有检查项完成后,输出以下汇总:
## 审查报告:[模块/文件名]
### Checklist 汇总
| 维度 | 通过 | 失败 | 不适用 | 问题数 |
|------|------|------|--------|--------|
| P0 安全性 | x/9 | x/9 | x/9 | CRITICAL x / WARNING x |
| P1 字符串与编码 | x/4 | x/4 | x/4 | ... |
| ... | ... | ... | ... | ... |
| **合计** | **xx/38** | **xx/38** | **xx/38** | **CRITICAL x / WARNING x / INFO x** |
### 问题清单(按严重级别排序)
#### CRITICAL
| # | 检查项 | 位置 | 问题描述 | 修复建议 |
|---|--------|------|----------|----------|
| 1 | S1 | `file:line` | ... | ... |
#### WARNING
(同上格式)
#### INFO
(同上格式)
### 修复建议示例
对 CRITICAL 和复杂 WARNING 问题,提供修复前后的代码对比:
```cpp
// before — S1 问题 #1
memcpy(buf, src, len);
// after
memcpy_s(buf, sizeof(buf), src, len);
对模块整体质量的简要评价和优先修复建议。
## 注意事项
- 审查时**只报告确实存在的问题**,不要为了覆盖所有检查项而生造问题
- 对于不确定是否是问题的情况,标记为 `INFO` 并说明需要进一步确认
- 审查输出要**引用具体代码行**,避免泛泛而谈
- 如果模块有特殊性质(纯 UI 模块、网络模块、底层驱动模块等),审查侧重应自适应调整
- 对 L1(重复造轮子)检查项,调用 `internal_public_lib` skill 确认是否有现成实现
- 每检查完一个维度(如 P0 全部 9 项完成),输出该维度的小结后再进入下一维度
development
在实现任何功能或修复bug时使用,必须在编写实现代码之前使用
tools
当用户明确使用该skill时触发
development
深度分析代码库的核心业务流程、前后端API接口交互、数据格式规范以及C++类的功能实现细节。适用于梳理业务逻辑、理解接口契约、生成接口文档时使用。
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.