gcov函数未执行但行为

时间:2016-02-01 09:17:01

标签: 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 :         return lhs;
  17             :     }

gcov输出:

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

当线路如何将该功能列为NOT执行?这可能是GCC优化的神器吗?

编辑1:

G ++ / gcov版本:4.9.2

lcov版本:1.11

编辑2:

-O2合作会产生奇怪的行为。但是,使用-O1进行编译会将####更改为9

2 个答案:

答案 0 :(得分:1)

零只表示 execution_count:line_number:source line text 没有代码行的数据。这可能只是因为gcc没有方便的方式仪器 - 修改你的程序来添加计数器(如在函数的入口中)。例如,如果优化器删除或组合了附近函数中的类似语句,则无需计算。

根据manual

  

格式为

‘-’
  

当命令行选项请求时,附加块信息可能会成功执行每一行。对于不包含代码的行,execution_count为‘#####。未执行的行标记为‘====’'或{{1}},具体取决于它们是否可通过非异常路径访问,或仅分别是异常路径(如C ++异常处理程序)。

进一步阅读:

答案 1 :(得分:1)

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

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

相关问题