Покрытие кода (Lcov) неправильно показывает 100% покрытие - PullRequest
3 голосов
/ 12 июля 2020
• 1000 хотя мой код пропускает 2 функции (1 конструктор и 1 value() функция). Есть ли какие-то настройки, которые мне не хватает?

lcov скриншот

1 Ответ

0 голосов
/ 12 июля 2020

Потому что функции встроены . Когда функция-член определена в определении класса / структуры, это неявно встроенная функция. Компилятор генерирует код только для встроенных функций при их вызове. И lcov использует встроенный механизм покрытия gcov G CC, который основан на вставке счетчиков в сгенерированный машинный код. Итак:

  • компилятор не генерирует код для этих функций
  • таким образом gcov не знает, что эти функции существуют
  • таким образом lcov не знает этих функций Существуют

Это систематическое c ограничение всех инструментов покрытия стиля gcov / lcov / gcovr.

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

Концепция inline в C ++ не относится к оптимизации встраивания, а больше связана с компоновкой и правилом одного определения ( ODR). Определение функций / объектов должно быть видимым во всех модулях компиляции, где они используются, и компоновщик может объединять противоречащие друг другу определения (исключение из ODR). Обратной стороной является то, что компилятор обычно не генерирует код для встроенной функции, если она не используется. Функция может быть встроенной, если она отмечена ключевым словом inline или определена в теле класса / структуры:

struct Example {
  void inline_function() { ... }
  void also_inline();
  void not_inline();
};

inline void Example::also_inline() { ... }

void Example::not_inline() { ... }
...