【问题标题】:How to find memory leaks with Clang如何使用 Clang 查找内存泄漏
【发布时间】:2015-09-19 13:45:36
【问题描述】:

我在我的机器 (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

但它们都没有显示出任何内存泄漏的迹象。

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

谁能告诉我如何正确使用 Clang 进行内存泄漏检测。

【问题讨论】:

  • 在测试你的程序时使用valgrind。在一般情况下,不可能静态地找到此类错误(但某些工具可能会启发式或保守地找到一些错误)。并且-fsanitize=address 添加了运行时检查,所以你需要运行程序。
  • 你试过$ scan-build clang -fsanitize=address -g hello.c吗?
  • $ scan-build clang -fsanitize=address -g hello.c 是的,我试过了
  • 查看生成的代码,确认编译器没有优化掉main的主体。

标签: c memory-leaks clang clang-static-analyzer memory-leak-detector


【解决方案1】:

有趣的是,如果你在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;
  ^~~~~~~~

【讨论】:

  • 另外,如果你使用 clang++ 并说 x = nullptr 而不是 'x = 0`,即使使用全局变量,它也会检测到它。
猜你喜欢
  • 2012-02-27
  • 2011-07-05
  • 2017-12-30
  • 2010-12-01
  • 2018-05-31
  • 2019-08-20
  • 2014-03-26
相关资源
最近更新 更多