能否在同一次构建中同时启用AddressSanitizer和ThreadSanitizer?
ASAN与TSAN同构建支持问题解答
核心结论
AddressSanitizer(ASAN)和ThreadSanitizer(TSAN)不支持合并到同一次构建中,必须分开构建测试。-fsanitize参数虽然支持同时指定多个合法的sanitizer类型,但ASAN和TSAN属于官方明确标注的互斥组合,无法同时启用。
具体原因
- 两者的运行时影子内存布局完全冲突:ASAN会占用进程虚拟地址空间中固定范围的区域做内存访问标记,TSAN自身也有一套独立的影子内存映射规则,二者的地址范围高度重叠,运行时无法同时加载两套sanitizer环境。
- 插桩逻辑与性能开销不兼容:ASAN的编译插桩主要围绕内存访问合法性检测设计,TSAN的插桩则围绕线程同步时序、内存访问所有权跟踪设计,同时插桩会导致运行时数据逻辑混乱,且叠加后的性能、内存开销会达到正常运行的数十倍,完全不具备实际测试可用性。
可兼容的sanitizer组合参考
-fsanitize参数支持同时指定多个非互斥的sanitizer,常用合法组合如下:
- 内存错误+未定义行为检测:
-fsanitize=address,undefined - 线程问题+未定义行为检测:
-fsanitize=thread,undefined - 内存错误+泄漏检测:LeakSanitizer默认已集成在大多数版本的ASAN中,无需额外指定,也可手动加
-fsanitize=address,leak显式启用。
建议使用方案
分开两次独立构建:
- 第一遍构建添加
-fsanitize=address相关参数,执行测试用例检测内存越界、释放后使用、野指针、内存泄漏等问题 - 第二遍构建添加
-fsanitize=thread相关参数,执行测试用例检测数据竞争、死锁等多线程相关问题
内容的提问来源于stack exchange,提问作者Desperado17
相关产品推荐
相关产品推荐

