为什么gcov报告类内函数定义不可执行?

时间:2014-06-20 06:21:42

标签: c++ g++ code-coverage gcov

似乎gcov不会将类方法的内联定义报告为可执行行。例如:

#include <iostream>

struct Foo {
  void bar() {}
  void baz() {}
};

int main() {
  Foo foo;
  foo.bar();
}

如果我用g++ -g -O0 -ftest-coverage -fprofile-arcs -o main main.cpp编译上述程序,运行它,并在其上调用gcov,我得到以下报告:

        -:    0:Source:main.cpp
        -:    0:Graph:main.gcno
        -:    0:Data:main.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <iostream>
        -:    2:
        -:    3:struct Foo {
        1:    4:  void bar() {}
        -:    5:  void baz() {}
        -:    6:};
        -:    7:
        1:    8:int main() {
        -:    9:  Foo foo;
        1:   10:  foo.bar();
        4:   11:}

为什么第5行报告为不可执行,即使上述方法被正确报告为执行一次?

更新

根据gcov文档(https://gcc.gnu.org/onlinedocs/gcc/Invoking-Gcov.html#Invoking-Gcov),-表示不可执行的行,而#####====标记可以执行的行,但不是{&1;}吨。

1 个答案:

答案 0 :(得分:2)

gcov报告链接您的二进制文件之后,从未有任何Foo::baz()被执行的可能性。

链接器完全删除了该函数,因此没有可执行文件是与该行相关联的代码。