Valgrind: возможно ли потерянное быть обработанным как определенно потерянное?

Могу ли я обработать вывод мемчека Valgrind, «возможно, потерян», как «определенно потерян»?

Возможно, потерян или «сомнительный»: указатель на внутреннюю часть блока найден. были продвинуты, или это может быть совершенно не связано. Memcheck считает такой блок «сомнительным», потому что неясно, указатель на него все еще существует.

Определенно потерян или «просочился»: худший результат - отсутствие указателя на блок. Блок классифицируется как «утечка», потому что программист не мог освободить его в программе выход, так как указатель на него не существует. Это, вероятно, симптом потеряв указатель в какой-то более ранней точке программы

33
задан lesmana 21 February 2014 в 10:34
поделиться

1 ответ

Да, я рекомендую лечить возможно потерянный так же серьезно, как определенно потерянный . Другими словами, исправляйте свой код до тех пор, пока не останется никаких потерь.

Возможная потеря может произойти, когда вы проходите по массиву, используя тот же указатель, который его удерживает. Вы знаете, что можно сбросить указатель, вычитая индекс. Но valgrind не может сказать, является ли это ошибкой программирования или вы умышленно делаете это намеренно. Вот почему он вас предупреждает.

Пример

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
  char* s = "string";
  // this will allocate a new array
  char* p = strdup(s);
  // move the pointer into the array
  // we know we can reset the pointer by subtracting
  // but for valgrind the array is now lost
  p += 1;
  // crash the program
  abort();
  // reset the pointer to the beginning of the array
  p -= 1;
  // properly free the memory for the array
  free(p);
  return 0;
}

Скомпилировать

$ gcc -ggdb foo.c -o foo

отчет Valgrind

$ valgrind ./foo
...
==31539== Process terminating with default action of signal 6 (SIGABRT): dumping core
==31539==    at 0x48BBD7F: raise (in /usr/lib/libc-2.28.so)
==31539==    by 0x48A6671: abort (in /usr/lib/libc-2.28.so)
==31539==    by 0x10917C: main (foo.c:14)
==31539== 
==31539== HEAP SUMMARY:
==31539==     in use at exit: 7 bytes in 1 blocks
==31539==   total heap usage: 1 allocs, 0 frees, 7 bytes allocated
==31539== 
==31539== LEAK SUMMARY:
==31539==    definitely lost: 0 bytes in 0 blocks
==31539==    indirectly lost: 0 bytes in 0 blocks
==31539==      possibly lost: 7 bytes in 1 blocks
==31539==    still reachable: 0 bytes in 0 blocks
==31539==         suppressed: 0 bytes in 0 blocks

...

Если вы удалите abort () , Valgrind не сообщит вообще об отсутствии потери памяти. Без прерывания указатель вернется в начало массива, и память будет свободна d должным образом.

Это тривиальный пример. В достаточно сложном коде уже не очевидно, что указатель может вернуться и вернется в начало блока памяти. Изменения в другой части кода могут привести к тому, что возможно потерянный будет определенно потерянным . Поэтому вам следует позаботиться о , возможно, потерянном .

61
ответ дан 27 November 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: