Skip to content

feat: add clang-tidy configuration file#20

Merged
Sunrisepeak merged 1 commit intomainfrom
add-clang-tidy
Mar 7, 2026
Merged

feat: add clang-tidy configuration file#20
Sunrisepeak merged 1 commit intomainfrom
add-clang-tidy

Conversation

@FrozenLemonTee
Copy link
Member

@FrozenLemonTee FrozenLemonTee commented Mar 7, 2026

本 PR 为项目新增 .clang-tidy
配置文件,用于统一项目的静态代码分析规则。

该配置采用白名单策略(whitelist),仅启用经过筛选的高价值检查,以提升代码质量、正确性、性能和可移植性,同时避免过于激进或风格化的规则。

适用场景:

  • 现代 C++ 项目(C++20 / C++23)
  • 通用基础库与泛型库
  • 容器 / 算法 / 工具类库

启用的检查类别

1. 编译器诊断

启用:

clang-diagnostic-*

作用:

  • 将编译器警告统一纳入 clang-tidy 输出
  • 便于 CI 与静态检查工具统一处理

2. Clang 静态分析器

启用:

clang-analyzer-*

提供更深入的静态分析能力,例如:

  • 空指针访问
  • 未初始化变量
  • 内存使用问题
  • 逻辑错误

3. Bug 检测

启用:

bugprone-*

用于发现常见编程错误,例如:

  • use-after-move
  • 可疑逻辑表达式
  • sizeof 使用错误
  • copy‑paste bug

4. 性能优化建议

启用:

performance-*

检测潜在性能问题,例如:

  • 不必要的对象拷贝
  • range‑for 复制
  • 低效容器操作

5. 现代 C++ 改进

启用:

modernize-*

用于建议使用现代 C++ 特性,例如:

  • nullptr
  • override
  • using
  • = default / = delete
  • emplace

为了避免过度激进的修改,禁用了以下规则:

modernize-use-auto
modernize-avoid-c-arrays

6. 通用检查

启用:

misc-*

提供一些通用且误报较少的检查,例如:

  • 未使用参数
  • header 中定义问题
  • 异常使用方式

7. 可移植性检查

启用:

portability-*

用于检测潜在的跨平台问题,提高代码在不同编译器和平台上的兼容性。


8. 部分可读性检查

启用规则:

readability-braces-around-statements
readability-implicit-bool-conversion
readability-simplify-boolean-expr
readability-qualified-auto

主要用于:

  • 强制控制语句使用大括号
  • 避免隐式 bool 转换
  • 简化布尔表达式
  • 提升 auto 声明可读性

clang‑tidy 示例

以下示例展示 clang‑tidy 在实际代码中的效果。


示例 1:缺少大括号

修改前

if (x > 0)
    doSomething();

clang-tidy 提示

readability-braces-around-statements

修改后

if (x > 0) {
    doSomething();
}

优势:

  • 避免未来修改时引入逻辑错误
  • 提高代码一致性

示例 2:不必要的拷贝

修改前

for (auto value : container) {
    process(value);
}

clang-tidy 提示

performance-for-range-copy

修改后

for (const auto& value : container) {
    process(value);
}

优势:

  • 避免不必要的对象拷贝
  • 提高性能

示例 3:use-after-move

修改前

std::string s = "hello";
auto t = std::move(s);

std::cout << s;

clang-tidy 提示

bugprone-use-after-move

修改后

std::string s = "hello";
auto t = std::move(s);

std::cout << t;

优势:

  • 防止使用已移动对象
  • 避免潜在运行时错误

示例 4:现代 C++ 改进

修改前

int* p = NULL;

clang-tidy 提示

modernize-use-nullptr

修改后

int* p = nullptr;

优势:

  • 更安全的空指针表示
  • 现代 C++ 风格

未启用的规则

以下规则未启用,原因包括:

  • 风格过于主观
  • 与模板库或算法实现冲突
  • 误报较多

未启用规则:

readability-identifier-naming
readability-magic-numbers
readability-function-size

此外还禁用了部分生态特定规则:

fuchsia-*
zircon-*
abseil-*
android-*
llvm-*

这些规则主要针对特定项目代码风格,不适用于通用 C++ 项目。


设计原则

  1. 优先保证代码正确性
  2. 关注潜在 Bug 与性能问题
  3. 避免过度限制代码风格
  4. 适用于模板库与泛型代码
  5. 保持规则稳定性

后续计划

未来可能考虑进一步评估并引入以下规则组:

cppcoreguidelines-*
concurrency-*
hicpp-*

可能在后续PR中陆续添加。

关于命名规范(PascalCase、UPPER_CASE、camelCase等)自动检查方面:

readability-identifier-naming

由于配置复杂,后续PR中添加。

@Sunrisepeak Sunrisepeak merged commit 9e29d06 into main Mar 7, 2026
@Sunrisepeak Sunrisepeak deleted the add-clang-tidy branch March 7, 2026 10:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants