Покрытие статической библиотеки GCOV для исходного кода C

Я хочу выполнить покрытие кода в статической библиотеке. Для этого я написал тестовые примеры с помощью boost. В моей библиотеке у меня есть много функций, определенных в файлах заголовков.

Например, в файле заголовка precision.h у меня есть следующие функции

static float absf( float x )
{
    return (x >= 0.0f) ? x : -x;
}

static boolean almost_zero( float n, float tol )
{
    return (boolean)(absf( n ) <= tol);
}

Я написал тестовые примеры для этих функций. Но проблема в том, что GCOV показывает, что эти функции не покрываются. Если я перенесу определение функции в файл C, я получу правильные результаты покрытия.

Я использовал -fprofile-arcs -ftest-coverag для выполнения покрытия. Кто-нибудь знает по этому поводу.

Примечание.
Тестовые наборы выполняются правильно. Я подтвердил это отладкой.
Я использую MinGW gcc версии 4.8.1 (GCC).


person Saneesh kumar    schedule 10.07.2015    source источник
comment
absf() кажется немного бессмысленным, почему бы вместо этого не использовать стандартный fabs()? Также boolean нестандартен, используйте bool.   -  person unwind    schedule 10.07.2015
comment
возвращаемый тип absf должен быть с плавающей точкой.   -  person ryanpattison    schedule 10.07.2015
comment
absf и почти_zero - фиктивные функции для объяснения сценария :). В любом случае я редактировал возвращаемый тип   -  person Saneesh kumar    schedule 11.07.2015


Ответы (1)


Функции в файлах заголовков сложно охватить. Это не просто техническая сложность - это еще и сложность презентации. Эти функции копируются каждый раз, когда заголовок #included. Требует ли полное покрытие покрытия всех копий? Или этот один экземпляр накрыт?

С точки зрения пользователя оба ответа могут быть неправильными.

Кроме того, в файлах заголовков могут быть скрытые функции, которые не интересуют пользователя. Например, у ctype.h их несколько.

Вероятно, поэтому инструменты покрытия обычно их полностью игнорируют.

Я работаю над инструментом покрытия RapiCover, и наш подход заключается в том, чтобы игнорировать их по умолчанию, но предоставить возможность включить покрытие для заголовков. Опцию можно использовать для каждого файла отдельно, а также вы можете указать конкретные функции, для которых требуется охват. Мы обнаружили, что это лучший способ удовлетворить типичные требования клиентов.

Я предлагаю вам попытаться заставить gcov поверить, что функции определены в исходном коде C, а не в заголовке. Для этого предварительно обработайте исходный файл (например, параметр -E для GCC), а затем отфильтруйте # маркеры, обозначающие файлы и номера строк. Затем выполните gcov с этим предварительно обработанным отфильтрованным файлом. Он должен видеть все функции как часть исходного кода. Этот трюк будет работать и с RapiCover, хотя там в этом нет необходимости.

person Jack Whitham    schedule 10.07.2015
comment
Можете ли вы объяснить _ отфильтруйте # маркеры, обозначающие файлы и номера строк_. - person Saneesh kumar; 13.07.2015
comment
Пропустите программу C / C ++ через препроцессор (например, gcc -E), и вы увидите их на выходе. Это строки, начинающиеся с #. - person Jack Whitham; 13.07.2015