GCOV函数不执行,但行执行

gcov function is not executed but lines are

本文关键字:执行 GCOV 函数      更新时间:2023-10-16

我一直在使用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:    }

当行被列为未执行时,如何将函数列为未执行?这可能是 GCC 优化的工件吗?

编辑 1:

G++/gcov 版本:4.9.2

LCOV 版本:1.11

编辑2:

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

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

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

零只是表示gcov没有代码行的数据。 发生这种情况只是因为 gcc 没有方便的方法来检测 — 修改程序以添加计数器(如函数的条目(。 例如,如果优化程序删除或组合附近函数中的类似语句,则没有什么可计算的。

根据手册:

格式为

 execution_count:line_number:source line text

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

延伸阅读:

  • 为了提高覆盖范围,您对解释 gcov 输出有什么技巧?
  • 解释 GCAV 输出以识别基本块