You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在同一次构建中同时启用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显式启用。

建议使用方案

分开两次独立构建:

  1. 第一遍构建添加-fsanitize=address相关参数,执行测试用例检测内存越界、释放后使用、野指针、内存泄漏等问题
  2. 第二遍构建添加-fsanitize=thread相关参数,执行测试用例检测数据竞争、死锁等多线程相关问题

内容的提问来源于stack exchange,提问作者Desperado17

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:21:03