Как интерпретировать ветки gcovr?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как интерпретировать ветки gcovr?

Сообщение Anonymous »

У меня возникли проблемы с пониманием некоторых отчетов gcovr. Покрытие строки очевидно - либо строка была выполнена, либо нет, но с ветвями сложнее, так как я получаю больше ветвей, чем ожидал.
Вот фрагмент кода, с которым я сейчас борюсь:

Код: Выделить всё

static bool is_root(const fs::path& path);
static std::vector gather_gitignores(const fs::path& path) {
if (fs::is_directory(path / ".git")) {
return {};
}

auto current = fs::absolute(path);
auto result = std::vector{};

while (!is_root(current)) {
current = current.parent_path();
const auto gitignore = current / ".gitignore";
if (fs::exists(gitignore)) {
result.push_back(gitignore);
}
if (fs::is_directory(current / ".git")) {
return result;
}
}
return result;
}
Все отображается зеленым, кроме символа while (!is_root(current)), который показывает:

Код: Выделить всё

✓ Branch 0 (35→36) taken 35 times.
✓ Branch 2 (36→11) taken 19 times.
✓ Branch 3 (36→37) taken 16 times.
✗ Branch 1 (36→37) not taken.
Я в замешательстве, так как ожидал бы только одну ветвь - либо is_root() возвращает false, поэтому условие истинно, и мы переходим к следующей строке, либо оно возвращает false, и мы переходим к последней строке функции. Также не должно быть исключительных путей, поскольку функция берет ссылку на уже существующий аргумент и возвращает примитив. В других частях кода простые строки while, подобные этой, обозначаются как 2/2, так что это не похоже на то, что дополнительная ветвь возникает из-за «запуска ноль/один/более раз», который я видел в некоторых других инструментах.
Я думаю, что все 35, 36, 11 и 37 — это метки в сборке, но как я могу узнать, каким частям кода они соответствуют? В столбцах рядом с источником отображаются только номера строк и количество обращений, а не метки. Я также изучил другие форматы вывода и вывод gcov -H, но не нашел ничего полезного.
Изменить: только что заметил, что (36→37) указан дважды, так что может ли это быть ошибка gcov/gcovr?

Подробнее здесь: https://stackoverflow.com/questions/798 ... r-branches
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»