clang

Installation
SKILL.md

Clang

用途

引导开发者掌握 Clang 特有功能:更优质的诊断、sanitizer 集成、优化备注、静态分析和 LLVM 工具链。涵盖与 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)
ThinLTO -flto -flto=thin(更快)
静态分析器 -fanalyzer clang --analyzeclang-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-*:真实 bug(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

# ThinLTO(更快的链接,质量相当)
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:合并 profile
llvm-profdata merge -output=prog.profdata default.profraw

# 步骤 4:使用 profile
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 intrinsic 在 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;不要 strip 二进制文件
  • xcrun clang 解析为 Xcode 工具链的 clang

标志参考见 references/flags.md。 clang-tidy 配置示例见 references/clang-tidy.md

相关技能

  • GCC 等效标志映射使用 skills/compilers/gcc
  • -fsanitize=* 工作流使用 skills/runtimes/sanitizers
  • IR 级工作(optllcllvm-dis)使用 skills/compilers/llvm
  • Windows 上的 clang-cl 使用 skills/compilers/msvc-cl
  • 链接器级 LTO 详情使用 skills/binaries/linkers-lto
Related skills

More from killvxk/low-level-dev-skills-zh

Installs
1
First Seen
Mar 21, 2026