如何通过带有`if / else if / else`的gcovr获得100%的分支覆盖率

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过带有`if / else if / else`的gcovr获得100%的分支覆盖率相关的知识,希望对你有一定的参考价值。

我是第一次使用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处理。

我很脾气,因为最终结果是分支覆盖率不到100%。这只是“方式”还是我致命的误解了?

答案

您可能想要重构:

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条件。

以上是关于如何通过带有`if / else if / else`的gcovr获得100%的分支覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

el 表达式的if else

#if, #elif, #else, #endif 使用

如何在角度 7 中使用带有 [ngClass] 的 if-else 条件? [复制]

jsp EL表达式if-else三种用法

MySQl 错误 #1064 存储过程 IF ELSE 带有多个 SELECT 语句

关于JAVA中IF…ELSE的嵌套?