SuperAPI AI 工具集

sanitizers

编程与开发

查看项目

更新于 10-15 15:12

技能介绍

用途

该技能用于指导代理在 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)。