Я использую GCC 4.9 с GCOV, чтобы получить код и зону покрытия. Однако результаты для охвата филиалов совершенно бесполезны для моего кода на C++. Кажется, что GCC строит шаблоны, несмотря на использование всех -fno-*-inline
флагов, которые я знаю.Как подавить вставку шаблонов с помощью gcov
Вот небольшой пример приложения, который иллюстрирует эту проблему:
#include <string>
#include <iostream>
using namespace std;
int main() {
string foo;
foo = "abc";
cout << foo << endl;
}
Я компилировать программу с g++ -O0 -fno-inline -fno-inline-small-functions -fno-default-inline --coverage -fprofile-arcs test.cpp -o test
После запуска test
, gcovr -r . -b
отпечатки:
------------------------------------------------------------------------------
GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File Branches Taken Cover Missing
------------------------------------------------------------------------------
test.cpp 14 7 50% 7,8,9,10
------------------------------------------------------------------------------
TOTAL 14 7 50%
------------------------------------------------------------------------------
Существует не одна ветвь в нашей функции main
. Например, строка 7 содержит string foo;
. Кажется, у конструктора std::basic_string<...>
есть некоторая if-инструкция, но это не полезная информация при просмотре покрытия main
.
Проблема заключается в том, что все эти встроенные ветви суммируются, и покрытие ответвления, рассчитанное для моих фактических модульных тестов, составляет около 40%. Меня интересует охват моего кода, в отличие от того, сколько ветвей я попал в стандартную библиотеку C++.
Есть ли способ полностью закрыть вложение в компилятор или сказать GCOV, чтобы не учитывать встроенные ветви? Я не мог найти ни одного руководства на домашней странице GCOV или где-то еще по этой теме.
Любая помощь очень ценится.
И что показывают выходные файлы gcov? Весь код библиотеки std будет отнесен к 'test.cpp' в сводке даже без инкрустации, но подробный вывод должен показать, какие фактические функции имеют ветви. – Useless