You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:23:11