Clang LeakSanitizer在O1及以上优化级下能否检测内存泄漏?
1. 背景
- 我们以C文件
a.c作为内存泄漏的最小可复现示例(MRE),内容如下:
#include <stdlib.h> void Foo() { malloc(1); } int main() { Foo(); return 0;}
- 一方面,执行以下命令时,集成于Clang AddressSanitizer的Clang LeakSanitizer会如预期检测到内存泄漏:
$ clang++ -g -fsanitize=address a.c; ./a.out ================================================================== ==...==ERROR: LeakSanitizer: detected memory leaks Direct leak of 1 byte(s) in 1 object(s) allocated from: #0 0x... in malloc (/.../a.out+0xa114e) (BuildId: ...) #1 0x... in Baz() (/.../a.c:2:14 #2 0x... in main (/.../a.c:3:14 #3 0x... in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16 SUMMARY: AddressSanitizer: 1 byte(s) leaked in 1 allocation(s).
- 另一方面,Clang AddressSanitizer文档的使用章节提到:
为获得合理性能,需添加
-O1或更高优化级别。
2. 疑问
- 若执行以下添加了
-O1代码生成选项的命令,Clang LeakSanitizer无法检测到内存泄漏:
$ clang++ -O1 -g -fsanitize=address a.c; ./a.out
3. 技术问询
当使用O1或更高优化级别时,Clang LeakSanitizer是否仍能检测到内存泄漏?
- 若是,请提供可复现的最小示例(MRE)予以证明。
- 若否,请说明原因(如提供Clang编译器源码链接等)。
4. 备注
- Clang LeakSanitizer文档的使用章节未明确提及不应使用代码优化。
- 上述测试基于Clang 18版本,该版本通过LLVM自动安装脚本安装在Linux Ubuntu 22.04.3系统上。
- 正如user17732522在评论中解释的,背景部分的
a.c示例在使用-O1选项时无法检测到内存泄漏,原因如下:
优化后的程序不存在实际内存泄漏。由于malloc调用不影响可观察行为,会被优化掉
内容的提问来源于stack exchange,提问作者NeverStopLearning
相关产品推荐
相关产品推荐

