lcov помечает строки с объявлениями функций как достижимые, но не покрытые

Я пытаюсь использовать lcov (v1.13, в OS X, с clang в качестве компилятора) для создания покрытия кода для моего набора тестов, и я столкнулся с одной раздражающей проблемой, которую не знаю, как решить. На SO есть несколько похожих вопросов, но я не смог найти решение для этого. По какой-то причине объявления функций/членов помечаются как достижимые, но не выполняются, как в приведенном ниже примере (это определение встроенного метода в заголовке):

введите здесь описание изображения

Это делает метрики покрытия строк бесполезными, поэтому я надеялся, что есть способ исправить это, не помечая каждое объявление как LCOV_EXCL_LINE.

Используемые флаги компилятора довольно стандартны:

-g -O0 -fno-inline -ftest-coverage -fprofile-arcs -fno-elide-constructors

Странно то, что определения методов в исходных файлах также помечены красным, хотя тела — нет, например:

// header.h
class Foo { 
    void bar();      // ignored, marked as unreachable
}  

// header.cpp
void Foo::bar() {    // marked as red (reachable / not executed)
    do_something();  // marked as covered
}

Если это имеет какое-либо значение, исходные файлы являются частью статической библиотеки, которая статически связана с тестовой системой в CMake.


person aldanor    schedule 24.12.2017    source источник


Ответы (1)


Отвечая на мой собственный вопрос:

Судя по всему, lcov -i (первоначальный захват) предполагает, что стартовые строки функций инструментированы, тогда как с LLVM их на самом деле нет (тогда как с GCC, где они есть). Существует проблема GitHub основной ветки разработки (linux-test-project/lcov#30) документируя это более подробно.

Пока это не будет исправлено в lcov, я опубликовал простой временное решение — скрипт Python, который удаляет начальные строки функции из файла базового покрытия, что должно «исправить» это, по крайней мере, временно.

person aldanor    schedule 24.12.2017