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

Clang AddressSanitizer编译报错:undefined symbol: __asan_option_detect_stack_use_after_return

解决Clang AddressSanitizer编译时__asan_option_detect_stack_use_after_return未定义错误

问题描述

我尝试用Clang 3.8.0的AddressSanitizer编译C++代码,希望将Sanitize结果输出到核心转储中,因此添加了-fsanitize=address编译选项。最终使用的完整编译命令如下:

/opt/llvm-3.8.0/bin/clang++ \ 
--gcc-toolchain=/opt/gcc-5.2.0 -fsanitize=address -DLINUX \ 
-DLINUX64 -DTB_USE_RCU -DURCU_INLINE_SMALL_FUNCTIONS \ 
-DU_USING_ICU_NAMESPACE=0 -DNDEBUG -D_POSIX_PTHREAD_SEMANTICS \ 
-fPIC -D_GNU_SOURCE -DTB_USE_RCU -DTB_USE_RCU \ 
-D_GLIBCXX_USE_CXX11_ABI=0 -m64 --gcc-toolchain=/opt/gcc-5.2.0 \ 
-flto=full -std=gnu++14 -D_GLIBCXX_DEPRECATED= -pipe \ 
-fno-omit-frame-pointer -ffast-math -fno-finite-math-only \ 
-pthread -march=core2 -mtune=corei7 -g -O3 -Qunused-arguments \ 
-fnon-call-exceptions -fvisibility=hidden \ 
-fvisibility-inlines-hidden -Wall -Wextra -Wshadow \ 
-Wpointer-arith -Wno-self-assign -Wno-unused-function \ 
-Wno-gnu-empty-initializer -Wno-unused-parameter \ 
-Wno-ignored-qualifiers -Wno-mismatched-tags \ 
-Wno-unused-local-typedef -Wno-parentheses-equality \ 
-Wno-unused-private-field -Wno-missing-field-initializers \ 
-Wno-missing-braces -Werror=return-type \ 
-Werror=overloaded-virtual -c MyClass.cpp -o MyClass.o

但编译时遇到了如下错误:

undefined symbol: __asan_option_detect_stack_use_after_return

请问最简单的解决方法是什么?


解决方法

这个错误的核心原因是Clang 3.8版本中,链接时优化(LTO)与AddressSanitizer的兼容性存在缺陷——你使用了-flto=full选项,而ASan需要在编译和链接阶段保持一致的插桩逻辑,LTO的跨模块优化会破坏这种一致性,导致ASan相关的符号无法正确解析。

最简单的快速修复方案就是:

  • 移除编译命令中的-flto=full选项

去掉这个选项后,重新编译就能避免该符号未定义的问题,同时不影响AddressSanitizer的正常工作。

如果你确实需要保留LTO功能,另一个可行方案是升级Clang到4.0及以上版本——后续版本的LLVM对ASan和LTO的兼容性做了大幅改进,能更好地支持两者同时使用。

另外还要注意:后续链接可执行文件时,也需要确保添加-fsanitize=address选项,否则可能出现其他ASan相关的符号错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:21:22