用途
本技能用于指导智能体使用 Clang/LLVM 编译器针对 C/C++ 项目的相关功能,涵盖:更优秀的诊断信息、Sanitizer 集成、优化备注、静态分析以及 LLVM 工具链。同时介绍 Clang 与 GCC 的差异,以及 Apple/FreeBSD 平台的具体情况。
触发场景包括:
- “我想要更好的编译器诊断/错误信息”
- “如何使用 clang-tidy / clang-format?”
- “如何查看编译器优化了什么或没优化什么?”
- “我在 macOS / FreeBSD 上使用 clang”
- “用于 MSVC 兼容构建的 clang-cl”——参见 skills/compilers/msvc-cl
- Sanitizer 查询——参见 skills/runtimes/sanitizers
主要能力
1. 构建模式标志(与 GCC 相同部分)
Clang 接受大多数 GCC 标志。主要差异:
| 特性 | GCC | Clang |
|---|---|---|
| 最小体积 | -Os | -Os 或 -Oz(更激进) |
| 仅优化热点 | — | -fprofile-instr-use(LLVM PGO) |
| Thin LTO | -flto | -flto=thin(更快) |
| 静态分析器 | -fanalyzer | clang --analyze 或 clang-tidy |
2. Clang 专有诊断标志
# 内联显示修复建议
clang -Wall -Wextra --show-fixits src.c
# 限制错误数量
clang -ferror-limit=5 src.c
# 详细模板错误(禁用省略)
clang -fno-elide-type src.cpp
# 显示模板不匹配的树形差异
clang -fdiagnostics-show-template-tree src.cpp
Clang 的诊断包含精确的范围高亮和修复建议,这是 GCC 所缺少的。
3. 优化备注
优化备注可查看 Clang 做了什么或拒绝做什么:
# 内联器决策
clang -O2 -Rpass=inline src.c
# 未进行向量化
clang -O2 -Rpass-missed=loop-vectorize src.c
# 循环未被向量化的原因
clang -O2 -Rpass-analysis=loop-vectorize src.c
# 将所有备注保存为 YAML 以便后续处理
clang -O2 -fsave-optimization-record src.c
# 生成 src.opt.yaml
备注解读:
- remark: foo inlined into bar — 内联已发生;对热路径有利
- remark: loop not vectorized: loop control flow is not understood — 需重构循环
- remark: not vectorized: cannot prove it is safe to reorder... — 添加 restrict 或 #pragma clang loop vectorize(assume_safety)
4. 静态分析
# 内置分析器(CSA)
clang --analyze -Xanalyzer -analyzer-output=text src.c
# clang-tidy(独立工具,检查更丰富)
clang-tidy src.c -- -std=c++17 -I/usr/include
# 启用特定检查族
clang-tidy -checks='clang-analyzer-*,modernize-*,bugprone-*' src.cpp --
# 自动应用修复建议
clang-tidy -fix src.cpp --
常见 clang-tidy 检查族:
- bugprone-*:真实缺陷(use-after-move、悬垂等)
- clang-analyzer-*:CSA 检查(内存、空指针解引用)
- modernize-*:C++11/14/17 现代化
- performance-*:不必要的拷贝、可移动候选
- readability-*:命名、复杂度
5. 使用 lld 进行 LTO
# 完整 LTO
clang -O2 -flto -fuse-ld=lld src.c -o prog
# Thin LTO(链接更快,质量几乎相同)
clang -O2 -flto=thin -fuse-ld=lld src.c -o prog
# 检查 lld 是否可用
clang -fuse-ld=lld -Wl,--version 2>&1 | head -1
对于大型项目,推荐使用 ThinLTO:链接时间比完整 LTO 快 5-10 倍,代码质量相当。
6. PGO(LLVM 插桩)
# 第 1 步:插桩
clang -O2 -fprofile-instr-generate prog.c -o prog_inst
# 第 2 步:使用代表性输入运行
./prog_inst < workload.input
# 生成 default.profraw
# 第 3 步:合并配置文件
llvm-profdata merge -output=prog.profdata default.profraw
# 第 4 步:使用配置文件
clang -O2 -fprofile-instr-use=prog.profdata prog.c -o prog
AutoFDO(基于采样、侵入性更小):使用 perf 采集,用 create_llvm_prof 转换,配合 -fprofile-sample-use 使用。参见 skills/profilers/linux-perf。
7. GCC 兼容性
Clang 在驱动标志上刻意与 GCC 兼容。主要差异:
- Clang 不支持所有 GCC 专有属性;可用 __has_attribute(foo) 检查
- -Weverything 启用所有 Clang 警告(GCC 无对应项);对生产环境过于嘈杂,适合一次性审计
- 某些 GCC 内建函数在 Clang 上也需要 #include <x86intrin.h>
- 支持 __int128;__float128 在某些目标上需要 -lquadmath
8. macOS 细节
在 macOS 上,clang 是系统编译器(Apple LLVM)。要点:
- ld64 是默认链接器;lld 需要显式 -fuse-ld=lld 和 Homebrew LLVM
- 使用 -mmacosx-version-min=X.Y 设置部署目标
- macOS 上的 Sanitizer 使用 DYLD_INSERT_LIBRARIES;不要剥离二进制
- xcrun clang 解析为 Xcode 工具链的 clang
使用方式
标志参考见 references/flags.md;clang-tidy 配置示例见 references/clang-tidy.md。
相关技能:
- skills/compilers/gcc:GCC 等效标志映射
- skills/runtimes/sanitizers:-fsanitize=* 工作流
- skills/compilers/llvm:IR 级工作(opt、llc、llvm-dis)
- skills/compilers/msvc-cl:Windows 上的 clang-cl
- skills/binaries/linkers-lto:链接器级 LTO 细节
适用场景
适用于需要 Clang 特有诊断、优化分析、静态分析、Sanitizer、LTO/PGO 工作流以及 macOS/FreeBSD 平台 Clang 用法的 C/C++ 开发场景。
限制
资料未提供该技能的安装方式、收费模式、版本要求或具体平台支持范围等额外信息。