如何抑制AddressSanitizer对特定内存泄漏的检测?
如何抑制AddressSanitizer对特定内存泄漏的检测?
这个问题我之前也碰到过,ASAN这类工具虽然好用,但经常会把系统库或者第三方库(比如你这里的OpenSSL、glibc)里的“有意泄漏”当成问题报出来——毕竟有些内存是程序初始化时分配的,程序退出时系统会自动回收,根本不需要手动free。针对你遇到的这个OpenSSL + strerror_l的泄漏误报,给你几个实用的解决办法:
方法一:创建ASAN抑制文件(最推荐)
这是最灵活的方式,既能保留对自己代码的泄漏检测,又能忽略掉第三方库的误报。
新建一个抑制文件,比如叫
asan_suppress.txt,把下面的规则加进去:leak:strerror_l leak:ERR_load_ERR_strings如果你想更精确地匹配特定库的函数,也可以写成库路径的形式:
leak:/lib/x86_64-linux-gnu/libc.so.6 leak:/lib/x86_64-linux-gnu/libcrypto.so.1.0.2(规则格式是
<检测类型>:<匹配模式>,这里类型是leak,匹配模式可以是函数名、库路径,甚至正则表达式)运行程序的时候,通过环境变量指定这个抑制文件:
ASAN_OPTIONS=suppressions=asan_suppress.txt ./你的程序名
方法二:临时关闭所有泄漏检测(不推荐)
如果你只是想快速验证其他ASAN错误,暂时不想看泄漏报告,可以直接关闭泄漏检测功能:
ASAN_OPTIONS=detect_leaks=0 ./你的程序名
不过这个方法会关闭所有泄漏检测,包括你自己代码里的真正问题,所以只适合临时调试用。
方法三:修改第三方库代码(适合有编译能力的场景)
如果你是自己编译OpenSSL或者glibc,可以在对应分配内存的代码处添加ASAN的忽略注释:
__attribute__((no_sanitize("leak")))
把这个属性加到分配内存的函数或者代码块上,就能让ASAN跳过对这段内存的泄漏检测。不过这个方法需要修改第三方库源码,成本比较高,一般不推荐,除非你有特殊需求。
总结一下,优先用方法一的抑制文件,既能过滤误报,又不影响自己代码的检测,是最实用的方案。
备注:内容来源于stack exchange,提问作者TJahns
相关产品推荐
相关产品推荐

