使用clang++-20与libc++编译时出现AddressSanitizer分配释放不匹配问题求助
解决Clang+libc+++AddressSanitizer的alloc-dealloc-mismatch错误
问题场景
在WSL Ubuntu 22.04环境下,使用以下命令编译C++代码:
clang++-20 -stdlib=libc++ -fsanitize=address -std=c++23 code.cpp
运行编译后的程序时,触发了AddressSanitizer的alloc-dealloc-mismatch (operator new vs free)错误。移除-stdlib=libc++选项可消除错误,但因代码依赖std::print()必须保留该选项。
最小复现代码code.cpp:
#include <stdexcept> #include <iostream> int main() { try { throw std::runtime_error("blah"); } catch (const std::exception& e) { std::cout << e.what() << std::endl; } return 0; }
运行报错信息:
blah ================================================================= ==89869==ERROR: AddressSanitizer: alloc-dealloc-mismatch (operator new vs free) on 0x7be9594e0040 #0 0x55db012e9a06 in free (/mnt/c/Users/XXX/OneDrive/Desktop/CPP/a+0xcfa06) (BuildId: 86f094d32b8073486e9ac3a7c6a9d0643854ed87) #1 0x7fb95a39f59b in std::range_error::~range_error() (/lib/x86_64-linux-gnu/libc++abi.so.1+0x2959b) (BuildId: d7d99734f2d87018ea9a00655e07f5ed15b68b04) #2 0x7fb95a3a18a3 in __cxa_end_catch (/lib/x86_64-linux-gnu/libc++abi.so.1+0x2b8a3) (BuildId: d7d99734f2d87018ea9a00655e07f5ed15b68b04) #3 0x55db0132f6fd in main (/mnt/c/Users/XXX/OneDrive/Desktop/CPP/a+0x1156fd) (BuildId: 86f094d32b8073486e9ac3a7c6a9d0643854ed87) #4 0x7fb95a047d8f in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16 #5 0x7fb95a047e3f in __libc_start_main csu/../csu/libc-start.c:392:3 #6 0x55db01247474 in _start (/mnt/c/Users/XXX/OneDrive/Desktop/CPP/a+0x2d474) (BuildId: 86f094d32b8073486e9ac3a7c6a9d0643854ed87) 0x7be9594e0040 is located 0 bytes inside of 29-byte region [0x7be9594e0040,0x7be9594e005d) allocated by thread T0 here: #0 0x55db0132d1fd in operator new(unsigned long) (/mnt/c/Users/XXX/OneDrive/Desktop/CPP/a+0x1131fd) (BuildId: 86f094d32b8073486e9ac3a7c6a9d0643854ed87) #1 0x7fb95a40e05f in std::runtime_error::runtime_error(char const*) (/lib/x86_64-linux-gnu/libc++.so.1+0x5b05f) (BuildId: 00e94063b8101dfae8b51b968ad9cd5aafda4a15) #2 0x7fb95a047d8f in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16 SUMMARY: AddressSanitizer: alloc-dealloc-mismatch (/mnt/c/Users/XXX/OneDrive/Desktop/CPP/a+0xcfa06) (BuildId: 86f094d32b8073486e9ac3a7c6a9d0643854ed87) in free ==89869==HINT: if you don't care about these errors you may set ASAN_OPTIONS=alloc_dealloc_mismatch=0 ==89869==ABORTING
解决办法
临时规避方案
如果只是临时跳过错误,可设置AddressSanitizer的环境变量禁用该检查:
ASAN_OPTIONS=alloc_dealloc_mismatch=0 ./a.out
注意:此方法仅屏蔽错误提示,未修复根本问题,不建议在生产环境或调试阶段使用。
根本解决方法
问题根源是程序链接了不匹配的libc++abi库:用Clang的libc++分配内存,却用系统默认的libc++abi(通常与GCC配套)释放内存,导致分配器不一致。解决方式是显式链接与Clang版本匹配的libc++abi:
修改编译命令,添加-lc++abi选项:
clang++-20 -stdlib=libc++ -fsanitize=address -std=c++23 code.cpp -lc++abi
如果问题仍存在,需确保系统安装了与Clang 20匹配的libc++abi-20-dev包,或从LLVM源码构建完整的带ASAN支持的libc++和libc++abi库。
问题性质及上报建议
这不是Clang/libc++开发版本的预期行为,属于环境中库版本不匹配导致的兼容性问题。是否需要上报分两种情况:
- 若使用Ubuntu官方包出现此问题:可向Ubuntu包维护团队提交bug,说明Clang 20 + libc++-20-dev + ASAN组合下的复现步骤;
- 若确认是LLVM自身的兼容性问题:可在LLVM的Bugzilla平台提交报告,附上最小复现用例、环境信息及报错日志。
内容的提问来源于stack exchange,提问作者k1m190r
相关产品推荐
相关产品推荐

