Как найти утечки памяти с помощью Clang

Я установил Clang на свой компьютер (ubuntu), чтобы найти утечки памяти в моем коде 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 для обнаружения утечки памяти.


person Sai Ram    schedule 02.07.2015    source источник
comment
Используйте valgrind при тестировании своей программы. Такие ошибки в общем случае невозможно найти статически (но некоторые инструменты могут обнаруживать некоторые ошибки эвристически или консервативно). И -fsanitize=address добавляет проверки времени выполнения, так что вам нужно запустить программу.   -  person Basile Starynkevitch    schedule 02.07.2015
comment
вы пробовали $ scan-build clang -fsanitize=address -g hello.c?   -  person Sourav Ghosh    schedule 02.07.2015
comment
$ scan-build clang -fsanitize = address -g hello.c да, я пробовал   -  person Sai Ram    schedule 02.07.2015
comment
Посмотрите на сгенерированный код, чтобы убедиться, что компилятор не оптимизировал тело main.   -  person molbdnilo    schedule 02.07.2015


Ответы (1)


Интересно, что статический анализатор clang находит утечку памяти, если вы объявите void *x внутри main:

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;
  ^~~~~~~~
person Max Smolens    schedule 09.12.2015
comment
также, если вы используете clang ++ и говорите x = nullptr вместо 'x = 0', даже с глобальной переменной, он обнаруживает это. - person matiu; 10.09.2018