理解在lcov分支覆盖输出中的控制流程图

10

我正在尝试通过检查当前的代码覆盖率百分比来改善我的单元测试。我正在使用gcov和lcov来生成覆盖结果的HTML报告。然而,我在理解某些输出方面遇到了问题。我知道+表示执行了一个分支,-表示未执行。

131                 :          8 :         QString toString() const
132                 :            :         {
133 [ +  - ][ +  - ]:          8 :             return ((negative && !isZero()) ? "-" : "") + QString::number(sec) + "." + QString::number(nano).rightJustified(9, '0');
    [ +  - ][ +  + ]
    [ +  - ][ +  - ]
    [ +  - ][ +  - ]
            [ +  - ]
134                 :            :         }
变量negative的类型为布尔型,方法isZero的返回值也是布尔型。因此,我期望这里有四个分支,但我不明白输出如何符合这个期望。那么输出应该如何解释呢?当鼠标悬停在+/-符号上时,工具提示告诉我,已经执行了第3、6、9、11、12、14、17、20、23和26个分支,而第4、7、10、15、18、21、24和27个分支从未执行过。
1个回答

1
请参考下面的答案[1]:
简而言之,lcov与分支交互,特别是在内联调用方面,可以发现一些超出您控制范围的隐藏分支。
例如,编译器可以有效地内联模板函数(其中std::cout <<“foo”是其中之一)。这意味着该代码中存在的任何分支也可以被编译器看到。当然,这使得编译器进行更彻底的优化。这就是您在此处看到的分支。它不是您编写的代码,而是为您实例化的模板代码中的代码。
特别是,basic_ostream上的大多数格式化输出函数都将确保在执行格式化或插入工作之前流处于良好状态。
当我进行分支分析时,我倾向于忽略诸如此类的函数上的分支未命中。在C ++中有几个类似的地方,gcov / lcov检测到分支,但这只是实现细节。我试图专注于我控制的分支。
原因在于QString :: number()是一个静态函数,它调用内联函数[QString :: setNum] [2],其中包含许多分支。
可以查看下面的示例来说明这一点:
foo.h
extern void foo(int);

class Bar {
    public:
        inline bool doCheckInt(int a) { return a > 0 && a < 2; }


        static bool checkParam(int a) {
            Bar bar;
            return bar.doCheckInt(a);

        }
};

foo.cpp

#include "foo.h"
#include <iostream>

void foo(int num)
{
    if (Bar::checkParam(num)) {
        std::cout << "when num is equal to 1..." << std::endl;
    } else if (num == 2){
        std::cout << "when num is equal to 2..." << std::endl;
    } else {
        std::cout << "when num is equal to "<< num << std::endl;
    }
}

main.c

#include <stdio.h>
#include "foo.h"
 

 int main(void)
 {
    printf("Start calling foo() ...\n");
    foo(1);
    foo(2);
    return 0;
 }

编译并生成代码覆盖率报告(相关方法参见[此处][3]),可以得到如下关于函数foo()的覆盖率报告:

[![foo_coverage][4]][4]

我们可以看到,foo总共有8个分支(2 X 2 X 2),其中foo(1)和foo(2)命中了5个分支。

[1]: https://dev59.com/L6f1oIgBc1ULPQZFw3n5#69164983 [2]: https://github.com/radekp/qt/blob/master/src/corelib/tools/qstring.h [3]: https://shenxianpeng.github.io/2021/07/gcov-example/ [4]: https://istack.dev59.com/n6huJ.webp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接