Я использовал gcov для проверки покрытия кода. Теперь я получаю странный результат, некоторые функции перечислены как невыполненные, но строки в функции перечислены как выполненные.
вывод lcov:
13 0 : f<double>& operator*=(f<double>& lhs, const double& rhs)
14 : {
15 9 : // Some code...
16 0 : return lhs;
17 : }
вывод gcov:
#####: 13: f<double>& operator*=(f<double>& lhs, const double& rhs)
-: 14: {
9: 15: // Some code...
#####: 16: return lhs;
-: 17: }
Как функция может быть перечислена как НЕ выполненная, когда строка (и)? Возможно ли это артефакт оптимизации GCC?
РЕДАКТИРОВАТЬ 1:
Версия G ++ / gcov: 4.9.2
версия lcov: 1.11
РЕДАКТИРОВАТЬ 2:
Comping с -O2
дает странное поведение. Тем не менее, компиляция с -O1
изменяет ####
в 9
Ты должен бежать gcov
на неоптимизированный код. Это даст вам вывод, возможно, интерпретированный lcov, который будет гарантировать, что все строки запущены.
Затем вы можете скомпилировать с оптимизацией для версии выпуска.
Ноль просто означает, что gcov
не было данных для строки кода. Это может произойти только потому, что у gcc нет удобного способа инструмент — измените вашу программу, чтобы добавить счетчики (как в записи в функцию). Например, если оптимизатор удаляет или объединяет похожие операторы в соседних функциях, подсчитывать нечего.
Согласно руководство:
Формат
execution_count:line_number:source line text
Дополнительная информация о блоке может следовать за каждой строкой, когда запрашивается параметром командной строки. Execution_count является
‘-’
для строк, не содержащих код. Неисполненные строки отмечены‘#####
‘ или же‘====’
в зависимости от того, достижимы ли они не исключительными путями или только исключительными путями, такими как обработчики исключений C ++, соответственно.
Дальнейшее чтение: