ASAN未检测到placement new内存泄漏:是特性还是Bug?
这是ASAN的特性还是Bug?
以下为测试代码:
class Foo { int x = 5; int z = 10; }; int main() { void *memory = malloc(sizeof(Foo)); Foo *ptr = new(memory) Foo(); ptr = nullptr; }
ASAN未报告任何泄漏。但移除Foo *ptr = new(memory) Foo();语句后,ASAN检测到泄漏:
Direct leak of 8 byte(s) in 1 object(s) allocated from: 0x7f00b7a80a89 __interceptor_malloc asan_malloc_linux.cpp:69 0x55dfa164d1ca main main.cpp:12 0x7f00b74a72cf (libc.so.6+0x232cf)
环境信息
- 编译环境:GCC 12.2.0
- 编译命令:
[1/2] /usr/sbin/c++ -g -fsanitize=address -fsanitize=leak -std=gnu++14 -MD -MT CMakeFiles/test.dir/main.cpp.o -MF CMakeFiles/test.dir/main.cpp.o.d -o CMakeFiles/test.dir/main.cpp.o -c /src/self/test/main.cpp [2/2] : && /usr/sbin/c++ -g -fsanitize=address -fsanitize=leak CMakeFiles/test.dir/main.cpp.o -o test && : - 操作系统:
Linux WORKSTATION 5.19.4-zen1-1-zen #1 ZEN SMP PREEMPT_DYNAMIC Thu, 25 Aug 2022 17:31:19 +0000 x86_64 GNU/Linux
结论:这是ASAN的特性,而非Bug
当使用placement new(new(memory) Foo())时,ASAN会将malloc分配的原始内存块与构造出的Foo对象建立关联。ASAN的泄漏检测逻辑会追踪C对象的生命周期,即便你没有显式调用析构函数或free释放内存,ASAN也会认为这块内存已被C对象接管,不会标记为泄漏。而移除placement new语句后,malloc分配的内存没有关联任何C++对象,ASAN就会正常识别出这是未释放的内存泄漏。
内容的提问来源于stack exchange,提问作者Enerccio
相关产品推荐
相关产品推荐

