当前位置: 首页 > 知识库问答 >
问题:

如何用Clang发现内存泄漏

李博达
2023-03-14

我已经在我的机器(ubuntu)中安装了Clang,以便在我的C代码中查找内存泄漏。我写了一个示例代码来检查它的工作情况,如下所示:

/* File: hello.c for leak detection */
#include <stdio.h>
#include <stdlib.h>

void *x;

int main() {
  x = malloc(2);
  x = 0; // Memory leak
  return 0;
}

我在互联网上找到了一些编译选项

$ scan-build clang --analyze hello.c

$ scan-build clang -fsanitize=address hello.c

但它们都没有出现内存泄漏的迹象。

扫描构建:使用“/usr/bin/clang”进行静态分析
扫描构建:删除目录“/tmp/scan-build-2015-07-02-122717-16928-1”,因为它不包含报告
扫描构建:未发现错误。

任何人都可以告诉如何正确使用Clang进行内存泄漏检测。

共有1个答案

宦烈
2023-03-14

有趣的是,如果您在main中声明void*x,clang静态分析器会发现内存泄漏:

int main() {
  void *x = malloc(2);
  x = 0; // Memory leak
  return 0;
}

通过运行以下命令来分析此代码:

scan-build clang -g hello.c

给出如下警告:

hello.c:9:3: warning: Potential leak of memory pointed to by 'x'
  return 0;
  ^~~~~~~~
 类似资料:
  • 我有内存泄漏,我知道它在哪里(我想是这样的),但我不知道为什么会发生。负载测试以下endpoint(使用服务器)时发生内存泄漏: 我非常肯定对象没有被(垃圾回收器)释放。在每一个请求中,应用程序使用的内存都在增长。我做了一些附加测试: 因此,在每个请求中,我都将big object分配给对象作为其属性。我观察到,有了这个附加属性,内存增长得快得多。在60秒内每完成1000个请求,内存会增加100M

  • 在阅读了大量有关MAT的内容后,我使用我的生产堆转储来分析内存泄漏问题。下面是泄漏报告错误: 线程org.apache.tomcat.util.threads.taskthread@0x6d8be0a30 http-bio-8443-exec-115保留总大小为3,695,816,440(89.03%)字节的局部变量。 内存累积在“'<'System class Loader'>”加载的“java

  • 问题内容: 我怀疑我们的ActiveMQ连接桥中存在严重的内存泄漏- 我们看到的是典型的内存泄漏模式(应用程序加载正常,如果长时间运行或在短时间内一次又一次地重新启动,则会降低速度) 。我查找了发现Java内存泄漏的现代最佳实践,许多开发人员似乎正在放弃传统工具(如jhat / jmap)来代替new(er)。 启动此工具(并花几个小时阅读其教程)后,我便能够为CPU和内存拍摄探查器快照。 在这一

  • 问题内容: 从昨天开始,我们的Redis服务器逐渐(每小时200MB)使用更多的内存,而密钥(330K)及其数据量(132MB redis-rdb- tools )则保持不变。 redis-cli info的输出显示6.89G已用内存? 当我们将(.net)客户端代码从BookSleeve 1.1.0.4更新到ServiceStack v3.9.71以准备升级到Redis 2.8时,问题就开始了。

  • 问题内容: 您如何找到Java中的内存泄漏(例如使用JHat)?我试图在JHat中加载堆转储,以进行基本了解。但是,我不明白我应该如何找到根引用(ref)或任何被称为根引用的东西。基本上,我可以说哈希表条目有几百兆字节([java.util.HashMap $ Entry或类似的东西),但是地图到处都是……使用某种方法可以搜索大型地图,还是找到大对象树的一般根? [编辑]好的,到目前为止,我已经阅

  • 问题内容: 由于这是我第一次学习系统编程,因此我很难将规则束之高阁。现在,我对内存泄漏感到困惑。让我们考虑一个例子。说,Rust正在抛出一个Python将会捕获的指针(指向字符串)。 在Rust中,(我只是发送的指针) 在Python中,(我取消引用了指针) 现在,我的问题是释放内存。我认为应该在Python中将其释放,但随后所有权会突然增加。因为,似乎采用了不可变的参考。因此,我对于是否应该在R