Valgrind подавил ошибки ... Grrr - PullRequest
0 голосов
/ 17 мая 2019

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

HEAP SUMMARY:
  in use at exit: 23,221,680 bytes in 25 blocks
  total heap usage: 27 allocs, 2 frees, 23,222,816 bytes allocated

  Searching for pointers to 25 not-freed blocks
  Checked 49,347,544 bytes

  672 bytes in 24 blocks are still reachable in loss record 1 of 2
       at 0x4C29792: malloc (** DETAILS OMITTED **)
       by 0x2011F54: (** DETAILS OMITTED **)
       by 0x405C75: main (** DETAILS OMITTED **)

  23,221,008 bytes in 1 blocks are still reachable in loss record 2 of 2
       at 0x4C29792: malloc (** DETAILS OMITTED **)
       by 0x2011F54: (** DETAILS OMITTED **)
       by 0x21B34CC: (** DETAILS OMITTED **)
       by 0x20125DF: (** DETAILS OMITTED **)
       by 0x406D14: main (** DETAILS OMITTED **)

LEAK SUMMARY:
    definitely lost: 0 bytes in 0 blocks
    indirectly lost: 0 bytes in 0 blocks
    possibly lost: 0 bytes in 0 blocks
    still reachable: 23,221,680 bytes in 25 blocks
    suppressed: 0 bytes in 0 blocks

ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

Две подавленные ошибки происходят из-за "все еще достижимых" ошибок. Я хотел бы, чтобы они считались правильными ошибками, чтобы программа возвращала код ошибки.

1 Ответ

1 голос
/ 17 мая 2019

Две подавленные ошибки происходят из-за "все еще достижимых" ошибок.

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

#include <stdlib.h>

int main(void) {
    void *p = malloc(8);

    return (int) p;
}

Я получаю

==22685== LEAK SUMMARY:
==22685==    definitely lost: 0 bytes in 0 blocks
==22685==    indirectly lost: 0 bytes in 0 blocks
==22685==      possibly lost: 0 bytes in 0 blocks
==22685==    still reachable: 8 bytes in 1 blocks
==22685==         suppressed: 0 bytes in 0 blocks
==22685== 
==22685== For counts of detected and suppressed errors, rerun with: -v
==22685== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Обратите внимание, что 8 байтов, как сообщается, все еще достижимы, и есть ноль подавленных (или не подавленных) ошибок.

Я бы хотел, чтобы эти ошибки считались правильными, чтобы программа возвращала код ошибки.

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

Совершенно другое дело - выйти с кодом ошибки в случае утечек разного рода. Вы написали в комментариях, что вы выполняете свой тест valgrind следующим образом:

valgrind --leak-check=full --show-reachable=yes --show-leak-kinds=all --error-exitcode=1 \
    --track-origins=yes --log-file=LOG_FILE_NAME -v EXECUTABLE_NAME

Примечательно, что в предоставляемых вами опциях отсутствует значение --errors-for-leak-kinds, которое отделено от --show-leak-kinds и по умолчанию definite,possible. Комбинация --error-exitcode=1 --errors-for-leak-kinds=all должна привести к тому, что valgrind посчитает (и сообщит) все классы утечек как ошибки, и, следовательно, выйдет со статусом 1 в случае, если он обнаружит любую память, все еще выделенную при выходе из программы.

...