用途
qt-cpp-review 是一个面向 Qt6 C++ 代码的结构化、只读代码审查技能。当用户提出审查相关任务(如 review、check、audit、look over、code review、sanity check),或需要验证 Qt6 C++ 代码质量时使用;也可在提交代码前建议运行。
主要能力
该技能将确定性 lint 检查与并行智能体深度分析结合,分三个阶段执行,且不跳过任何阶段。
阶段一:确定性 lint 检查
运行统一 Python linter 对目标文件进行单遍扫描,要求 Python 3.6+,无外部依赖。若 Python 不可用,会警告用户并跳到阶段二。命令为:
python3 references/lint-scripts/qt_review_lint.py <files...>
# 若找不到 python3,回退为:
python references/lint-scripts/qt_review_lint.py <files...>
linter 输出具有确定性、可重复,且被视为权威结果。规则类别(60+ 项检查)包括:INC(包含顺序、qglobal.h、qNN 重复)、DEP(废弃的 Qt/std 类用法)、PAT(反模式,如 min/max、std::optional、NRVO、COW detach 等)、MDL(QAbstractItemModel 契约)、ERR(错误处理)、LCY(生命周期)、API(命名)、ENM(枚举)、HDR/TMO/CND/VAL/TRN(头文件、超时、条件、值类、三元运算符)。
阶段二:智能体驱动的深度分析
并行启动六个聚焦的审查智能体,每个智能体只读,绝不编辑或写入文件。每个智能体拥有明确范围和检查清单,可读取范围内所有源文件、搜索代码库追踪符号,并按结构化格式报告发现。置信度阈值:>80 为确认发现,60–79 为调查目标(所有智能体合计最多 10 个),<60 抑制。智能体不会重复阶段一 lint 已标记的问题。
六个智能体及其范围:
- 模型契约:QAbstractItemModel 信号协议、角色系统、索引有效性、代理模型正确性。检查 beginInsertRows/endInsertRows 平衡、roleNames() 与 data() 不匹配、dataChanged 空角色向量、beginRemoveRows 的 first > last、flags() 不当标志、setData() 未发 dataChanged、代理模型访问源模型内部、索引空间错误等。
- 所有权与生命周期:内存所有权、父子关系、资源清理、Rule of Five、RAII 正确性。检查裸指针 new 无对应释放、QNetworkReply 缺少 deleteLater()、Q_ASSERT 包裹副作用表达式、Q_ASSERT 作为唯一空指针保护、多态 QObject 子类缺少 Q_DISABLE_COPY_MOVE、缺少虚析构、QTimer/QObject 无父对象且无生命周期管理、connect 可能空指针、悬垂指针跟踪列表、无界容器增长、析构未递归清理子对象、YAGNI 违规等。
- 线程安全:跨线程 QObject 访问、互斥一致性、工作线程发信号。检查 QtConcurrent::run() 或 QThread 工作线程写入 QObject 成员无同步、工作线程信号以 Qt::DirectConnection 连接主线程接收者、后台线程修改模型、共享容器多线程修改无一致同步、非原子共享计数器增减、非所有者线程操作 QTimer 等。
- API、命名与 C++ 正确性:Qt 命名约定、const 正确性、移动语义、枚举卫生、noexcept 正确性。检查 get 前缀误用、非 const getter(尤其 Q_PROPERTY READ 访问器)、缺少 std::forward<T>()、return std::move(localVar) 阻止 NRVO、const 局部变量阻止隐式移动、const 方法通过裸指针返回可变指针、noexcept 与 Q_ASSERT 不兼容、无作用域枚举无底层类型、最后一个枚举项缺尾逗号、switch 枚举带 default 标签、项目自有词汇用字符串表示、布尔参数陷阱、枚举放置、QList<QString> 代替 QStringList、缺少 const、用户可见排序用大小写敏感比较、重复验证逻辑、const QMetaObject::Connection 阻止句柄清理等。
- 错误处理与验证:缺失错误检查、输入验证、安全。检查 QFile::open() 返回值被忽略、QJsonDocument::fromJson() 未检查 isNull()/isObject()、QNetworkReply::error() 未检查即 readAll()、XML writer hasError() 未检查、硬编码 http://、无 SSL 错误处理、网络请求无超时、接受负值、导入数据无 schema/版本验证、无输入长度验证、QString::arg() 占位符数量错误、saveToFile() 无视 I/O 错误返回 true、错误报告模式不一致等。
- 性能与代码质量:性能反模式、死代码、不必要拷贝、代码异味。检查循环内构造 QRegularExpression、roleNames() 每次重建 QHash、非 const range-for 触发 COW detach、共享 QHash 非 const operator[]、昂贵操作先于廉价提前退出、死/不可达代码、魔法数字、上帝类、复制粘贴逻辑、陈旧成员缓存未失效、QMap/QHash 迭代顺序不确定、小固定数据用 QMap、频繁调用方法按值返回容器、维护但从不读取的成员变量、缺少可重入保护、setter 静默重置无关状态、提前返回跳过状态/信号更新等。
阶段三:合并与报告
合并 lint 脚本输出与所有智能体发现,去重(同文件+行+问题合并为一条),应用置信度评分,按固定格式输出最终报告。报告包含:范围与文件数、问题数(lint 与深度分析分别计数)、lint 发现(每条含文件、规则、发现、缓解建议)、深度分析发现(每条含文件、类别、置信度、发现、追踪、缓解建议)、调查目标(最多 10 条,按置信度排序,含未验证原因与验证方法)、汇总表。
使用方式
/qt-cpp-review:仅使用通用 Qt6 C++ 规则进行审查。/qt-cpp-review framework:额外应用 Qt 框架/模块开发规则(BC、导出、d-pointer、qdoc、QML 版本管理)。
框架模式检测:若参数包含 framework 则启用。若未传参,则扫描范围内前几个文件寻找框架信号;若发现两个或以上信号,会建议用户运行 framework 模式,但不会自动启用,需用户确认。框架信号包括:QT_BEGIN_NAMESPACE/QT_END_NAMESPACE、Q_CORE_EXPORT 等导出宏、包含私有头文件、Q_DECLARE_PRIVATE/Q_D()/Q_Q()、CMakeLists.txt 中的 qt_internal_add_module 或 qt_add_module、仓库根目录的 sync.profile 或 .qmake.conf。启用框架模式时,向 linter 传 --framework(若支持),加载框架检查清单,并在各智能体任务上下文中包含框架规则。
范围检测:根据用户语言判断。差异/提交范围(窄)由“this commit”“these changes”“the diff”“what I changed”“my changes”“staged changes”“outstanding changes”“before I commit”等触发,运行 git diff 与 git diff --cached 获取变更集;若说“this commit”则用 git diff HEAD~1..HEAD,仅审查变更行及 ±50 行上下文,只报告变更行中的问题。代码库范围(宽)由“review the codebase”“audit the project”“check the repository”“review src/”或给定具体文件/目录路径且无提交语言时触发,用 glob 匹配 .cpp、.h、*.hpp 并审查所有匹配文件。
适用场景
适用于 Qt6 C++ 代码的提交前审查、代码库审计、质量验证,以及需要同时获得确定性规则检查与多领域深度分析结果的场景。
限制
该技能为只读,不会编辑或写入文件。lint 阶段依赖 Python 3.6+,若不可用则跳过。调查目标最多 10 条,需人工验证。框架模式不会自动启用,仅建议。置信度低于 60 的发现会被抑制。