用途
该技能用于指导代理在 C/C++ 开发中选择、启用并解读编译器运行时 Sanitizer,帮助定位内存错误、未定义行为、数据竞争和内存泄漏等 bug。
主要能力
技能提供了一张决策树,按 bug 类型推荐对应 Sanitizer:
- 内存越界、释放后使用(use-after-free)、双重释放(double-free)→ AddressSanitizer(ASan)
- 栈越界、全局越界 → ASan(上述三类均由 ASan 覆盖)
- 未初始化读取 → MemorySanitizer(MSan,仅 Clang,需全 clang 构建)
- 未定义行为(整型溢出、空指针解引用、错误类型转换)→ UBSan
- 数据竞争(多线程)→ ThreadSanitizer(TSan)
- 仅内存泄漏 → LeakSanitizer(LSan,可独立或经由 ASan)
- 多类问题 → ASan + UBSan 组合(常用),但不能与 TSan 或 MSan 组合
技能还涵盖 HWASan(ARM64 硬件辅助)、MemTagSanitizer(ARM MTE)、GWP-ASan(生产环境采样)以及内核模块的 KASAN。
使用方式
各 Sanitizer 通过编译标志启用,例如:
- ASan:
gcc -fsanitize=address -fno-omit-frame-pointer -g -O1 -o prog main.c - UBSan:
gcc -fsanitize=undefined -g -O1 -o prog main.c - TSan:
clang -fsanitize=thread -g -O1 -o prog main.c - MSan:
clang -fsanitize=memory -fno-omit-frame-pointer -g -O1 -o prog main.c
运行时可通过环境变量配置,如 ASAN_OPTIONS=detect_leaks=1:abort_on_error=1:log_path=/tmp/asan.log ./prog。技能列出了常用 ASAN_OPTIONS 键及效果,并给出 ASan、UBSan、TSan 报告的解读方法。还涉及抑制文件(suppressions)写法、CMake 集成方式(SANITIZE 选项)和 GitHub Actions CI 集成示例。
适用场景
适用于 C/C++ 程序的调试、代码质量保障和缺陷定位,尤其适合需要系统性排查内存与并发问题的开发流程。可结合 profilers/valgrind(ASan 不可用时的 Memcheck)、runtimes/fuzzing(自动生成触发用例)、compilers/gcc 或 compilers/clang 获取构建标志上下文。
限制
- ASan 不可与 TSan、MSan 组合;TSan 与 ASan、MSan 不兼容。
- MSan 仅 Clang 支持,且要求全量 instrumented 构建,系统库需重建或替换为 MSan 包装。
- HWASan 需 ARM64 且支持 TBI 或 MTE,无法与 ASan 在同一构建中组合。
- MemTagSanitizer 为实验性,需支持 MTE 的 ARM64 硬件。
- GWP-ASan 以概率方式捕获堆越界/UAF,glibc 集成为实验性。
- 各 Sanitizer 有不同性能开销(ASan 约 2x,HWASan 约 1.2–1.5x,MSan 约 3x)。