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

标签 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 ),- 表示不可执行的行,而 #####==== 标记可以执行但不能执行的行。

最佳答案

gcov 报告说链接您的二进制文件后,Foo::baz() 永远不可能被执行。

链接器完全删除了该函数,因此不再有可执行文件与该行相关联。

关于c++ - 为什么 gcov 将类内函数定义报告为不可执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24321099/

相关文章:

c++ - 为字典 cpp 创建一个 []= 运算符

c++ - 无法从 int[][] 转换为 int**?

g++ - 对`boost::this_thread的 undefined reference :

junit - 使用assertTrue而不是assertNull时丢失分支

c# - DotCover 不覆盖引用的 DLL

c++ - 为什么必须将函数必须返回的数组声明为静态数组?

用于方法组和装饰器的 C++ SFINAE

c++ - 在 SciTE 中链接 C++

python - Theano : MissingGxx , g++ 不可用

python - 如何在代码中使用Python覆盖率