Две подавленные ошибки происходят из-за "все еще достижимых" ошибок.
Почти наверняка нет. Результаты проверки на утечку, выполняемой при выходе из программы, в значительной степени отделены от анализа ошибочных обращений к памяти, выполняемых во время работы программы. Вы можете протестировать с помощью фиктивной программы, такой как эта, которая все еще достижимой памяти, не выдает подавленную ошибку:
#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 в случае, если он обнаружит любую память, все еще выделенную при выходе из программы.