C++ 未执行gcov函数,但行被删除

C++ 未执行gcov函数,但行被删除,c++,gcc,g++,gcov,lcov,C++,Gcc,G++,Gcov,Lcov,我一直在使用gcov检查代码覆盖率。我现在得到一个奇怪的结果,有些函数列为未执行,但函数中的行列为已执行 lcov输出: 13 0 : f<double>& operator*=(f<double>& lhs, const double& rhs) 14 : { 15 9 : // Some code... 16 0

我一直在使用gcov检查代码覆盖率。我现在得到一个奇怪的结果,有些函数列为未执行,但函数中的行列为已执行

lcov输出:

  13           0 :     f<double>& operator*=(f<double>& lhs, const double& rhs)
  14             :     {
  15           9 :         // Some code...
  16           0 :         return lhs;
  17             :     }
#####:   13:    f<double>& operator*=(f<double>& lhs, const double& rhs)
    -:   14:    {
    9:   15:        // Some code...
#####:   16:        return lhs;
    -:   17:    }
gcov输出:

  13           0 :     f<double>& operator*=(f<double>& lhs, const double& rhs)
  14             :     {
  15           9 :         // Some code...
  16           0 :         return lhs;
  17             :     }
#####:   13:    f<double>& operator*=(f<double>& lhs, const double& rhs)
    -:   14:    {
    9:   15:        // Some code...
#####:   16:        return lhs;
    -:   17:    }
当行被删除时,如何将函数列为未执行?这可能是GCC优化的产物吗

编辑1:

G++/gcov版本:4.9.2

lcov版本:1.11

编辑2:


与-O2复合会产生奇怪的行为。然而,使用-O1编译时,将0更改为9只表示gcov没有代码行的数据。这可能是因为gcc无法方便地插入指令——修改程序,将计数器添加到函数的条目中。例如,如果优化器删除或组合附近函数中的类似语句,则没有什么可计算的

根据报告:

格式是

当命令行选项请求时,每行后面可能会出现其他块信息。对于不包含代码的行,执行计数为“-”。未执行的行标记为“′”或“====”,取决于它们是否是由非特殊路径访问的,或者仅是异常路径,例如C++异常处理程序。 进一步阅读:

您应该在未优化的代码上运行gcov。这将为您提供输出,可能由lcov进行解释,从而确保所有行都已运行


然后,您可以在上进行编译,并对发布版本进行优化。

您正在运行哪个版本的gcc/gcov?您对gcov使用了什么命令行选项?这可能是内联的结果吗?当我运行gcov时,我得到了不同的文件格式::89:uint8\u t index=dbSize-1;因此,它表示未执行,后跟行号,然后是行的文本。@quamrana g++/gcov 4.9.2,我使用lgov生成输出。你能运行一个实验并定义一个从未调用过的完整函数来查看上面的差异吗?好的,这会起作用。我通常使用-O3来避免500倍的运行时间。