为何ASAN无法检测new后未执行delete导致的内存泄漏?
问题描述
我正在构造内存泄漏场景以使用*ASAN(AddressSanitizer)*检测内存泄漏,操作步骤如下:
$ export MallocNanoZone='0' # 避免OS X上的相关问题 $ cat new_delete.cc class Dummy { public: Dummy(int x) { sz = x; } private: int sz; }; void func(int i) { Dummy* p = new Dummy(i); if (i < 50) { // 从这里返回的话,堆上会有内存泄漏,Dummy对象未被释放 return; } // 执行其他操作 delete p; } int main() { func(10); } $ clang++ -fsanitize=address -g -O0 new_delete.cc $ ./a.out
我原本预期ASAN能检测到该内存泄漏,但实际并未检测到。请问我忽略了什么?
我使用的是OS X系统,clang版本信息如下:
$ clang++ --version Apple clang version 12.0.0 (clang-1200.0.32.28) Target: x86_64-apple-darwin21.6.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
解决方案
在OS X系统上,ASAN默认不会自动启用内存泄漏检测功能,你需要显式开启它。修改运行命令,添加ASAN_OPTIONS=detect_leaks=1环境变量:
ASAN_OPTIONS=detect_leaks=1 ./a.out
原因是ASAN的泄漏检测模块属于可选组件,在OS X平台默认未激活,必须通过该环境变量显式开启后,才能捕获到你代码中的内存泄漏场景。
此外,Apple Clang 12.0.0对应的ASAN对小对象泄漏的检测是正常的,你的Dummy对象内存大小足够触发检测,启用该选项后就能看到预期的泄漏报告。
内容的提问来源于stack exchange,提问作者foxtrot9
相关产品推荐
相关产品推荐

