Игнорировать "все еще достижимый" при установке возвращаемого значения
В CI-системе я запускаю тесты сгусток с valgrind, где я ожидаю возвращаемое значение 0
, если никакие ошибки не найдены valgrind и 1
в противном случае. Сами тесты успешно выполняются и возвращают 0
.
Вот что означает error-exitcode
для:
--error-exitcode=<number> exit code to return if errors found [0=disable]
Теперь у меня есть программа, которая создает still reachable
из сторонней библиотеки. Не идеально, но все в порядке. Я пытаюсь определить, что still reachable
не является ошибкой, вызвав:
valgrind --errors-for-leak-kinds=definite,indirect,possible --error-exitcode=1 ./tests
который печатает
==9198== LEAK SUMMARY:
==9198== definitely lost: 0 bytes in 0 blocks
==9198== indirectly lost: 0 bytes in 0 blocks
==9198== possibly lost: 0 bytes in 0 blocks
==9198== still reachable: 392 bytes in 4 blocks
==9198== suppressed: 0 bytes in 0 blocks
но все же возвращает 1
.
Есть ли способ игнорировать still reachable
в возвращаемом значении?
Ответы
Ответ 1
TL; DR: используйте
valgrind --leak-check=full --error-exitcode=1 ./tests
Хорошо, думаю, я нашел ответ, создав SSCCE
SSCCE
Пусть memLeakTest.cpp
be
#include <cstdlib>
#include <iostream>
void makeDefinitelyLostPointer()
{
int* definitelyLostPointer = new int(5555);
(*definitelyLostPointer) += 1;
}
void makeStillReachablePointer()
{
int* stillReachablePointer = new int(3333);
std::exit(0);
(*stillReachablePointer) += 1;
}
int main()
{
//makeDefinitelyLostPointer();
makeStillReachablePointer();
return 0;
}
- Запустить
g++ memLeakTest.cpp -o memLeakTest
- Запустите
./memLeakTest; echo $?
, где показано возвращаемое значение 0
- Выполнить
valgrind ./memLeakTest; echo $?
, возвращает 0
- Выполнить
valgrind --leak-check=full --error-exitcode=1 ./memLeakTest
, возвращает 0
, если makeDefinitelyLostPointer()
отключен, а 1
, если makeDefinitelyLostPointer()
включен. В обоих случаях все еще доступны.