SuperAPI AI 工具集

clang

编程与开发

查看项目

更新于 10-15 15:12

技能介绍

用途

本技能用于指导智能体使用 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++ 开发场景。

限制

资料未提供该技能的安装方式、收费模式、版本要求或具体平台支持范围等额外信息。