sanitizer工具
在协议模糊测试中使用Sanitizer工具需要满足特定前置条件并注意配置细节,以下是关键要点:
🛠️ 一、前置条件与编译器要求
编译器版本
ASan/UBSan/TSan:需Clang ≥ 3.2 或 GCC ≥ 4.8(推荐GCC ≥ 4.9或Clang最新版以获得完整功能)。
MSan:需Clang ≥ 3.4,且必须静态链接所有依赖库(包括libc),否则检测可能失效。
验证命令:clang --version 或 gcc --version。
调试符号生成
编译时需添加 -g 选项生成调试信息,否则错误报告无法定位代码行号。
gcc -fsanitize=address -g your_program.c -o your_program
平台与架构支持
ASan/UBSan:支持Linux x86_64、ARM、AArch64等主流平台。
TSan:仅支持64位系统(Linux x86_64/AArch64),不支持32位平台。
MSan:对Linux依赖性强,且需所有代码(含第三方库)完全插桩。
⚙️ 二、编译选项与运行时配置
Sanitizer类型 编译选项 关键运行时环境变量 检测能力说明
ASan -fsanitize=address export ASAN_OPTIONS=disable_coredump=0:abort_on_error=1 内存越界、释放后使用、泄漏
UBSan -fsanitize=undefined export UBSAN_OPTIONS=print_stacktrace=1 整数溢出、空指针解引用等未定义行为
TSan -fsanitize=thread 无需额外变量,但需避免与ASan混用 数据竞争、死锁
MSan -fsanitize=memory export MSAN_OPTIONS=poison_in_dtor=1 未初始化内存访问
💡 编译注意事项:
-
添加 -fno-omit-frame-pointer 确保调用栈可读。
-
TSan需额外加 -fPIE -pie 保证位置无关代码。
-
MSan需用 -static-libsan 静态链接运行时库。
⚠️ 三、兼容性与性能权衡
工具互斥性
ASan与TSan不可同时启用(内存模型冲突),需分开测试。
MSan需独立运行,因它要求所有代码(包括libc)完全插桩。
性能开销
工具 速度降低 内存开销 适用场景
ASan 2x 3x 常规内存错误检测
TSan 5x-15x 5x-10x 高并发场景数据竞争分析
MSan 3x 2x-3x 未初始化内存敏感场景
生产环境禁用
Sanitizer的性能损耗和内存占用使其仅适用于测试环境,生产环境需移除编译选项。
🔧 四、高级配置技巧
定制错误报告
通过 ASAN_SYMBOLIZER_PATH=/path/to/llvm-symbolizer 指定符号解析器,提升堆栈可读性。
使用 attribute((no_sanitize(“thread”))) 排除特定函数插桩。
泄漏检测增强(ASan)
添加 -fsanitize=leak 可独立检测内存泄漏(无需完整ASan)。
MSan初始化追踪
启用 -fsanitize-memory-track-origins=2 可追溯未初始化值的来源链。
💎 总结
基础命令足够:用户提供的编译选项(如 -fsanitize=address)是核心,但需搭配 -g 及平台适配参数。
关键前置条件:验证编译器版本、确保调试符号、注意工具互斥性及平台限制。
进阶需求:通过环境变量定制错误报告行为,或结合覆盖率工具(如 -fsanitize-coverage=trace-pc-guard)提升模糊测试效率。
📌 实践建议:首次使用可从ASan入手(兼容性最佳),逐步扩展至TSan/MSan。完整示例参考 https://github.com/google/sanitizers/wiki/AddressSanitizer。