Мы запускаем gcovr на нашей кодовой базе, которая (FTR) затем загружается в SonarQube (cxx-plugin). Есть много мест, где отчет о покрытии менее 100%, даже если нет очевидных ответвлений, поэтому он обязательно должен быть 0 или 100%. Возьмем, к примеру, следующее:
std::string quote(const std::string& str, const std::string& quote_str) {
return quote_str + str + quote_str;
}
В SonarQube первая строка отображается как «Полностью покрыта». Вторая строка отображается как Частично охвачена тестами (1 из 2 условий). Третья строка не упоминается - как и ожидалось. Вопрос в том, какие условия (я полагаю) gcovr видит на обратной линии, чего я не могу.
Я пробовал предложение от Почему gcc 4.1 + gcov сообщает о 100% охвате веток, а более новые (4.4, 4.6, 4.8) сообщают о 50% для p = новый класс; line? (добавление --exclude-throw-branch) и даже пробовали добавить --exclude-unreachable-branch. Кажется, без разницы.
Глядя на сгенерированный вывод xml, я замечаю, что обе первые несколько строк показывают 57 совпадений с branch = false. Мне интересно, откуда взялось условие 1 из 2, и, возможно, это SonarQube?
Кто-нибудь еще видел это или есть решение?
Обновить
Я не упоминал об этом с самого начала, потому что это не казалось актуальным, но мы используем clang v11 (не gcc) и, следовательно, llvm-cov gcov (а не сам gcov) ниже gcovr. Как показано ниже, это кажется важным.
--exclude-throw-branches
действительно удаляет лишнюю ветку из отчетов. (Недостижимые ветки здесь не действуют, потому что этот параметр просто удаляет данные из строк, которые не похожи на код.) Сборка показывает больше ветвей, но это из-за встраивания, которое метод сбора покрытия игнорирует. Это не артефакт Sonarqube. Ваши подозрения в отношении системы сборки весьма вероятны. Для экспериментов с данными, которые видит gcovr, вы можете предпочесть запускgcov
напрямую. - person amon   schedule 24.09.2020