如何在LeakSanitizer中抑制alloc-dealloc-mismatch错误?
解决Boost库引发的AddressSanitizer分配-释放不匹配错误的抑制方法
先明确错误归属
你遇到的alloc-dealloc-mismatch错误是**AddressSanitizer(ASAN)**报出的,并非LeakSanitizer(LSAN)——LSAN仅负责内存泄漏检测,分配释放不匹配属于ASAN的内存错误检测范畴。另外,-fsanitize=address已经集成了LSAN的功能,无需同时添加-fsanitize=leak,这是你混淆配置的根源。
正确的抑制步骤
1. 创建ASAN抑制文件
新建一个抑制文件(比如命名为asan_suppressions.supp),根据错误栈选择以下任意一种规则写入:
规则一:针对具体出错函数
精准抑制boost::filesystem::path析构函数引发的错误:
alloc-dealloc-mismatch:*boost::filesystem::path::~path*
规则二:针对整个Boost文件系统库
如果该库还有其他同类错误,可直接抑制整个库:
alloc-dealloc-mismatch:*libboost_filesystem.so*
(若Boost为静态链接,可调整为匹配静态库路径或更宽泛的*boost_filesystem*)
2. 运行程序时加载抑制规则
通过环境变量指定抑制文件后运行程序:
ASAN_OPTIONS=suppressions=asan_suppressions.supp ./你的程序名
为什么之前的尝试失败
- 用LSAN的
leak:boost规则无效:因为此错误不是内存泄漏,LSAN规则对ASAN的分配释放不匹配错误无作用。 - 直接写
alloc-dealloc-mismatch:boost格式错误:ASAN的错误类型抑制规则需要用通配符*包裹匹配模式,确保能匹配到栈帧中的函数或库名。 - 使用
interceptor_via_fun等ASAN拦截器规则:这类规则用于抑制函数拦截相关的错误,不适用于alloc-dealloc-mismatch这类内存错误类型。
内容的提问来源于stack exchange,提问作者ventsyv
相关产品推荐
相关产品推荐

