Как сделать так, чтобы valgrind сообщал об ошибке, когда еще есть доступные ресурсы - PullRequest
5 голосов
/ 20 мая 2011

Я пишу компилятор, который производит код на C.Созданные программы состоят только из основной функции, и они используют много памяти, которая выделяется с помощью malloc ().Большая часть выделенной памяти используется только в небольшой части программы, и я подумал, что было бы неплохо освободить ее после ее использования, поскольку она не будет использоваться снова.Тогда я был бы рад, если бы valgrind сообщал мне о несвободной памяти () d в конце программы, то есть все еще доступной памяти.Я использую valgrind с --error-exitcode = 1 внутри Makefile, чтобы автоматически проверять наличие такого рода проблем.

Вопрос: есть ли способ заставить valgrind выйти с 1, если естьвсе еще достижимы ресурсы?

Ответы [ 4 ]

2 голосов
/ 23 июля 2015

Опции poroper для выхода с ошибкой при наличии достижимого блока на выходе:

valgrind --tool=memcheck --leak-check=full --show-reachable=yes --errors-for-leak-kinds=all

С Руководство Valgrind :

Поскольку существуют различные виды утечек с различной степенью серьезности, возникает интересный вопрос: какие утечки следует считать истинными «ошибками», а какие нет?

Ответ на этот вопрос влияет на числавыводится в строке ERROR SUMMARY, а также влияет на параметр --error-exitcode.Во-первых, утечка считается истинной «ошибкой» только в том случае, если указан параметр --leak-check = full.Затем опция --errors-for-leak-types = управляет набором типов утечек, которые рассматриваются как ошибки.Значением по умолчанию является --errors-for-leak-types = определенное, возможное

2 голосов
/ 23 мая 2011

Альтернатива просмотру вывода Valgrind: измените ваш компилятор так, чтобы он генерировал:

int main() { return foo_main(); }
int foo_main() {  /* whatever you've emitted before */ }

Предполагая, что вы не назначаете выделенные блоки глобальным переменным (что не имеет смысла, поскольку у вас есть только одна функция), вы только что превратили «все еще достижимый» в «определенно просочившийся».

Возможно, даже лучшее преобразование: не вызывайте exit(0) в вашем main;замените его на return 0;.Чистый эффект должен быть таким же, как указано выше - __libc_main теперь будет вызывать exit для вас, и все локальные переменные в main к этому времени будут вне области действия.

2 голосов
/ 20 мая 2011

В руководстве valgrind говорится:

Косвенно потерянные и все еще достижимые блоки не считаются истинными "ошибками", даже если указано --show-достижимое = да иони напечатаны;это потому, что такие блоки не нуждаются в прямом исправлении программистом.

Я не нашел способа сделать так, чтобы отчет valgrind "все еще был доступен" как ошибка.Похоже, что единственная возможность сделать это (кроме исправления valgrind) - захватить выходные данные valgrind и проанализировать строку «все еще достижима».

1 голос
/ 21 мая 2011

В качестве альтернативы вы можете иметь небольшой скрипт оболочки в вашем make-файле, чтобы выполнить поиск в выходных журналах valgrind и выйти соответствующим образом.

...