Почему gcov сообщает о 0% покрытии файла заголовка для хорошо используемого класса?
-
16-09-2019 - |
Вопрос
Я пытаюсь измерить тестовое покрытие в первый раз, используя gcov.Теперь, когда я прошел начальный этап обучения, все, кажется, идет хорошо, за исключением одной маленькой загвоздки.Я ожидаю, что это сводится к непониманию с моей стороны, поэтому я надеюсь, что кто-то, знакомый с gcov, сможет объяснить, что происходит.
Проблема в том, что у меня есть один конкретный заголовочный файл, показывающий 0% покрытия.Однако в Только вещь в этом заголовке - это объявление класса для хорошо используемого класса.
Кроме того, файл реализации для класса показывает 100% покрытие, и я могу указать на 5 различных тестов, где я точно знаю, что экземпляр класса успешно создается.
Итак, почему gcov сообщает о 0% охвате класса, и как я могу это исправить?
-- редактировать --
Как указал лакви ниже, если заголовок не содержит исполняемого кода, его не следует включать в вычисления покрытия.И фактически, из всех моих классов этот конкретный файл заголовка является единственным, для которого gcov пытается сгенерировать информацию о покрытии.
Я провел построчное сравнение с другими заголовками, и самое большое различие, которое я обнаружил, заключалось в том, что этот конкретный заголовок не имеет явного конструктора или деструктора, в то время как другие имеют.В попытке свести к минимуму различия между файлами я добавил явные ctor и dtor в класс problem.Однако это не имело никакого значения.
Решение
Похоже, я разобрался с проблемой.Как я и ожидал, это скорее проблема нехватки опыта, чем что-либо еще.
Как оказалось, gcov находил только подмножество доступных файлов трассировки и поэтому сообщал только о части общих результатов.Поиск и добавление остальных файлов трассировки устранили проблему.
Для всех, кому любопытно, проблемный заголовочный файл по-прежнему отображается в выходных данных.Фактически, все остальные заголовочные файлы делают то же самое, даже если они не содержат исполняемого кода.Тем не менее, все они показывают охват более 90%.
Другие советы
C ++ создает неявный деструктор, даже если вы не создали его явно.Если вы не уничтожите свой объект до завершения программы, этот неявный деструктор никогда не будет вызван.gcov показывает это, отмечая счетчик '0' в строке объявления класса.
Ваш заголовочный файл не содержит выполняемого кода.Поскольку ничего не выполняется (в объявлении класса нет выполняемого кода), нечего измерять и нечего покрывать.