Почему valgrind не обнаруживает эту возможную утечку памяти из-за realloc? - PullRequest
2 голосов
/ 01 октября 2019

Я не могу понять, почему valgrind (версия 3.14) не обнаруживает возможную утечку памяти в этой программе:

#include <stdlib.h>

int main() {
  int *p = malloc(sizeof(int));
  p = realloc(p, 2 * sizeof(int));

  free(p);

  return 0;
}

Стандарт C99 (ISO / IEC 9899: 1999, стр. 314) гласит:это примерно realloc:

Если память для нового объекта не может быть выделена, старый объект не освобождается и его значение не изменяется. [...] Функция realloc возвращает указатель на новый объект (который может иметь то же значение, что и указатель на старый объект), или нулевой указатель, если новый объект не может быть выделен.

Так что может случиться так, что p - это NULL, но ячейка памяти, ранее выделенная с помощью malloc, все еще там, разве это не может быть возможной утечкой памяти?

Если я скомпилирую программус gcc -std=c99 и я выполняю valgrind с --tool=memcheck --leak-check=full --track-origins=yes, это выдает следующее сообщение:

==313618== Memcheck, a memory error detector
==313618== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==313618== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==313618== Command: ./a.out
==313618== 
==313618== 
==313618== HEAP SUMMARY:
==313618==     in use at exit: 0 bytes in 0 blocks
==313618==   total heap usage: 2 allocs, 2 frees, 12 bytes allocated
==313618== 
==313618== All heap blocks were freed -- no leaks are possible
==313618== 
==313618== For counts of detected and suppressed errors, rerun with: -v
==313618== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

1 Ответ

9 голосов
/ 01 октября 2019

Valgrind не анализирует ваш код;он анализирует действия, предпринятые вашим кодом.

В этом конкретном прогоне realloc не произошел сбой, поэтому утечки памяти не было, поэтому valgrind ничего не сообщал:

ВсеБлоки кучи были освобождены

И это все, что знает Valgrind.

Чтобы обнаружить проблему в вашем коде, вам нужен инструмент статического анализа кода.

...