Подтвердить что ты не робот

Игнорировать "все еще достижимый" при установке возвращаемого значения

В 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 в возвращаемом значении?

4b9b3361

Ответ 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() включен. В обоих случаях все еще доступны.