代码风格检测规则知识库
本知识库面向开源社区三维基础几何引擎的代码风格检测场景,整理了项目平台所采用的 Google C++ 代码风格 在 clang-format 与 clang-tidy 工具链下的可执行检测规则、Google 预设的关键配置取值,以及对应的违规知识条目。
工具边界(重要):
clang-format 只负责排版/格式(缩进、空格、换行、大括号、对齐、#include 排序),不检查命名、不改语义。
- 命名约定、头文件保护宏、语义性可读性由
clang-tidy 的 readability-identifier-naming、google-*、llvm-header-guard、readability-* 等检查负责。
- 因此本文按"检测器(detector)"维度标注每条规则归属的工具,避免误以为
clang-format 能拦截命名问题。
| 模块 | 规则范围 | 主检测器 | 条目数 | 说明 |
|---|
| 命名约定 | CF-N.x | clang-tidy readability-identifier-naming / google-* | 8 | 类型/函数/变量/成员/常量/命名空间/宏/文件名 |
| 缩进与空白 | CF-I.x | clang-format | 5 | 缩进宽度、Tab、访问修饰符、case、行尾空白 |
| 列宽与换行 | CF-W.x | clang-format | 3 | 80 列、参数打包、模板换行 |
| 大括号与控制流 | CF-B.x | clang-format | 3 | 大括号附着、短语句单行、初始化列表 |
| 指针与空格 | CF-S.x | clang-format | 3 | 指针左对齐、控制语句空格、行尾注释空格 |
| 头文件组织 | CF-H.x | clang-format / clang-tidy | 3 | include 顺序与分组、保护宏 |
| 注释风格 | CF-C.x | clang-format / clang-tidy | 2 | // 注释、行尾注释对齐 |
| 合计 | CF-* | — | 27 | 风格检测规则与知识条目统一来源 |
- 1 工具链与流水线
- 2 Google 预设关键配置取值(
clang-format -style=google -dump-config)
- 3 命名约定(CF-N)
- 4 缩进与空白(CF-I)
- 5 列宽与换行(CF-W)
- 6 大括号与控制流(CF-B)
- 7 指针与空格(CF-S)
- 8 头文件组织(CF-H)
- 9 注释风格(CF-C)
- 10 标准知识条目列表
| 环节 | 工具 | 职责 | CI 命令(示例) |
|---|
| 格式校验 | clang-format | 排版一致性,差异即违规 | clang-format --dry-run --Werror -style=file <files> |
| 格式修复 | clang-format | 自动重排 | clang-format -i -style=file <files> |
| 命名/语义 | clang-tidy | 命名、保护宏、可读性 | clang-tidy -p build <files> |
| 增量校验 | git-clang-format | 仅校验改动行 | git clang-format --diff <base> |
- 规则配置以仓库根目录
.clang-format(BasedOnStyle: Google)与 .clang-tidy 为唯一事实来源,CI 与本地共用同一份配置。
- 检测日志中
clang-format 以统一 diff呈现违规;clang-tidy 以 file:line:col: warning: ... [check-name] 呈现,方括号内即规则编号。
以下为 BasedOnStyle: Google 的代表性取值;权威取值可用 clang-format -style=google -dump-config 重新导出。部分取值随 LLVM 版本演进(例如 AllowShortIfStatementsOnASingleLine、Standard),CI 应锁定 clang 版本。
| 选项 | Google 取值 | 含义 |
|---|
BasedOnStyle | Google | 继承 Google 预设 |
ColumnLimit | 80 | 行宽上限 80 列 |
IndentWidth | 2 | 缩进 2 空格 |
ContinuationIndentWidth | 4 | 续行缩进 4 空格 |
UseTab | Never | 禁用 Tab |
TabWidth | 8 | Tab 视觉宽度(仅展示用) |
AccessModifierOffset | -1 | public:/private: 相对类体回退 1 |
NamespaceIndentation | None | 命名空间体不额外缩进 |
IndentCaseLabels | true | case 标签缩进 |
PointerAlignment | Left | int* p(* 贴类型) |
DerivePointerAlignment | true | 从现有代码推断指针对齐(覆盖 PointerAlignment) |
SpaceBeforeParens | ControlStatements | if ( 有空格,foo( 无空格 |
BreakBeforeBraces | Attach | 左大括号与声明同行 |
AllowShortFunctionsOnASingleLine | All | 允许短函数写 成单行 |
AllowShortIfStatementsOnASingleLine | WithoutElse(新版)/true(旧版) | 允许短 if 单行 |
AllowShortLoopsOnASingleLine | true | 允许短循环单行 |
BinPackParameters | true | 形参尽量同行打包 |
BinPackArguments | true | 实参尽量同行打包 |
Cpp11BracedListStyle | true | {} 列表无多余内侧空格 |
SortIncludes | CaseSensitive | #include 排序 |
IncludeBlocks | Regroup | include 分组重排 |
AlignAfterOpenBracket | Align | 括号后续行对齐 |
AlignTrailingComments | true | 行尾注释对齐 |
SpacesBeforeTrailingComments | 2 | 行尾注释前 2 空格 |
AlwaysBreakTemplateDeclarations | Yes | template<...> 单独成行 |
Standard | Auto | 语言标准自动探测 |
由 clang-tidy 的 readability-identifier-naming 配合 Google 风格选项强制;clang-format 不检查命名。
| 编号 | 对象 | Google 约定 | 正例 | 反例 |
|---|
| CF-N.1 | 类型(class/struct/enum/typedef/别名/类型模板参数) | UpperCamelCase,无下划线 | class GeometryEngine; | class geometry_engine; |
| CF-N.2 | 普通函数 | UpperCamelCase | ComputeNormal() | compute_normal() |
| CF-N.3 | 变量(局部/全局/形参) | snake_case | int face_count; | int faceCount; |
| CF-N.4 | 类的非静态数据成员 | snake_case + 尾随下划线 | int vertex_count_; | int vertexCount; |
| CF-N.5 | 常量(constexpr/const 静态存储期) | k + UpperCamelCase | const int kMaxFaces = 1000; | const int MAX_FACES; |
| CF-N.6 | 命名空间 | 全小写 snake_case | namespace geom_kernel { | namespace GeomKernel { |
| CF-N.7 | 宏 | 全大写 + 下划线(且应尽量避免宏) | #define PI_VALUE 3.14 | #define piValue 3.14 |
| CF-N.8 | 文件名 | 全小写 + 下划线,.cc/.h(非头部包含用 .inc) | mesh_builder.cc | MeshBuilder.cpp |
| 编号 | 选项 | Google 取值 | 检测要点 |
|---|
| CF-I.1 | IndentWidth | 2 | 每级缩进 2 空格 |
| CF-I.2 | UseTab | Never | 一律空格,禁止 Tab |
| CF-I.3 | AccessModifierOffset | -1 | 访问修饰符相对类体回退 1 列 |
| CF-I.4 | IndentCaseLabels | true | switch 内 case 缩进 |
| CF-I.5 | 行尾空白 / 文件末换行 | — | 删除行尾空白,文件以单个换行结尾 |
| 编号 | 选项 | Google 取值 | 检测要点 |
|---|
| CF-W.1 | ColumnLimit | 80 | 单行不超过 80 列 |
| CF-W.2 | BinPackParameters/BinPackArguments | true | 参数打包策略一致 |
| CF-W.3 | AlwaysBreakTemplateDeclarations | Yes | template<...> 独占一行 |
| 编号 | 选项 | Google 取值 | 检测要点 |
|---|
| CF-B.1 | BreakBeforeBraces | Attach | 左大括号紧贴声明同一行 |
| CF-B.2 | AllowShortIfStatementsOnASingleLine | WithoutElse | 短 if 可单行,带 else 不可 |
| CF-B.3 | Cpp11BracedListStyle | true | 花括号初始化列表无多余内侧空格 |
| 编号 | 选项 | Google 取值 | 检测要点 |
|---|
| CF-S.1 | PointerAlignment/DerivePointerAlignment | Left/true | int* p(同文件保持一致) |
| CF-S.2 | SpaceBeforeParens | ControlStatements | if (/for ( 有空格,函数调用无 |
| CF-S.3 | SpacesBeforeTrailingComments | 2 | 行尾注释前 2 空格 |
| 编号 | 选项/检查 | 约定 | 检测要点 |
|---|
| CF-H.1 | SortIncludes/IncludeBlocks | CaseSensitive/Regroup | include 按组排序 |
| CF-H.2 | include 顺序 | 关联头→C 系统→C++ 标准库→第三方→本项目 | 组间空行分隔,组内字母序 |
| CF-H.3 | 头文件保护(llvm-header-guard 或 #pragma once) | <PROJECT>_<PATH>_<FILE>_H_ | 保护宏命名规范 |
| 编号 | 选项/检查 | 约定 | 检测要点 |
|---|
| CF-C.1 | 注释语法 | 优先 // 行注释 | 实现内避免成块 /* */ |
| CF-C.2 | AlignTrailingComments | true | 同块行尾注释对齐 |
每条规则采用统一字段:规则编号、规则名称、类别、检测器、漏洞描述、产生原因、影响范围、典型输入、日志特征、修复建议、相关案例、关联规则。其中规则编号优先采用工具原生标识(clang-format 选项名 / clang-tidy 检查名),以便检测日志直接映射到本条目。