Как получить 100% покрытие ветки с помощью gcovr с помощью `if / else if / else` - PullRequest
1 голос
/ 29 января 2020

Я впервые использую gcovr и столкнулся с запутанной проблемой с этим кодом:

    for (int i = 0; i < 4; i++)
    {
        bool a = i & 1;
        bool b = i & 2;

        if (a && b)
            printf("a and b\n");
        else if (a && !b)
            printf("a not b\n");
        else
            printf("the other two\n");
    }

(код работает так, как вы ожидаете, поэтому я ' я не собираюсь вставлять вывод.)

Тем не менее, gcovr решает, что у меня нет полного покрытия ветви:

✓✓     5 for (int i = 0; i < 4; i++)
         {
       4     bool a = i & 1;
       4     bool b = i & 2;

✓✓✓✓  4     if (a && b)
       1        printf("a and b\n");
✓✓✓✗  3      else if (a && !b)
       1         printf("a not b\n");
              else
       2         printf("the other two\n");
          }

Очевидно, что одна из четырех перестановок не обрабатывается else if, но только потому, что он был обработан первым if.

Я раздражительный, потому что результат net составляет менее 100% охвата ветвей. Это просто «путь» или я что-то неправильно понял?

Ответы [ 2 ]

1 голос
/ 29 января 2020

Вы можете изменить рефакторинг:

if (a)
{
    if (b)
    {
        std::cout << "a and b\n";
    }
    else
    {
        std::cout << "a and not b\n";
    }
}
else
{
    std::cout << "not a\n";
}

В опубликованном вами коде a оценивается в двух if выражениях.
В приведенном выше примере устраняется условие else if.

0 голосов
/ 30 января 2020

Я нашел простую альтернативу оптовому рефакторингу:

    for (int i = 0; i < 4; i++)
    {
        bool a = i & 1;
        bool b = i & 2;

        if (a && b)
            printf("a and b\n");
        else if (a /*&& !b*/)    // <--- comment out second condition (but leave it in place)
            printf("a not b\n");
        else
            printf("the other two\n");
    }

Мне нравится этот подход, потому что он все еще инкапсулирует логи c Я хочу, без лишних (и, следовательно, проблемных c) проверок.

...