Если программа не имеет утечек памяти, это означает, что ни одна из ее функций не имеет утечек памяти. Если вы запустили программу, убедились, что функция была выполнена для всех соответствующих сценариев использования, и Valgrind не обнаружил утечек, то функция не могла иметь утечек.
Если вы хотите обнаружить утечки только в функции, вы просто пишете для нее модульный тест и запускаете его под valgrind. Это облегчает охват некоторых случаев, которые могут быть затруднены при использовании внешнего интерфейса программы.
Конечно, valgrind - это динамический анализ, который может проверять только те утечки, которые действительно происходят во время тестового прогона, поэтому вам нужно позаботиться о том, чтобы получить хорошее покрытие. Это также подавляет утечки, когда еще есть нечто, похожее на действительный указатель на память. Это связано с тем, что многие библиотеки не беспокоятся об освобождении памяти при завершении работы (и это правильно; в любом случае система должна очищать ее), но иногда это может привести к ложному отрицанию. Статический анализ был бы лучше в этом отношении, но я не знаю ни одного хорошего для этой цели - обнаружить некорректное управление памятью статически очень сложно (даже Rust может надежно предотвратить использование после освобождения, но только большинство утечек, не все ).