如何从 gcov 获得更准确的结果?

Posted

技术标签:

【中文标题】如何从 gcov 获得更准确的结果?【英文标题】:How can I get more accurate results from gcov? 【发布时间】:2011-03-26 20:12:52 【问题描述】:

我正在使用 mingw gcc 4.4.0 试验 gcov。我得到了一些有趣但奇怪的结果。一个常见的模式是这样的......

     5162:   66:  std::string::iterator i = l_Temp.begin ();
     5162:   67:  std::string::iterator j = l_Temp.end () - 1;
        -:   68:  char ch;
        -:   69:
    20564:   70:  while (i < j)
        -:   71:  
    10240:   72:    ch = *i; *i = *j; *j = ch; i++; j--;
        -:   73:  
        -:   74:
    #####:   75:  return l_Temp;
        -:   76:

考虑到前面的循环显然正在执行和退出,怎么可能根本不执行 return?我想我是这里返回值优化的受害者,因为这个临时变量的类型是std::string

问题是,我已经在编译器选项中指定了-O0。这些是我正在使用的确切编译器标志...

-Wno-invalid-offsetof -g -O0 -fprofile-arcs -ftest-coverage

我最好的猜测是,-O0 毕竟并不是所有的优化都被禁用了。当我注意到问题时,我可以开始逐个寻找特定的优化标志,但这似乎是一件奇怪的事情。

那么 - 我应该指定哪些标志以便从 gcov 中获得合理的覆盖结果?

编辑

到目前为止,我认为我需要以下附加标志...

-fno-default-inline -fno-inline

我不确定它们是否都需要,但我认为它们都禁用了不同的特定类型的内联。

不过,我还没有找到任何禁用返回值优化的方法。这不是一个大问题,但它有点烦人。当目标是 100% 覆盖率时,由于这个问题,一些真正达到 100% 的文件将被报告为较少。 grep 可以找到 ##### 标记并显示它们是否用于 return 语句,但您仍然需要进行一些目视检查以检查问题是否纯粹是 RVO。

【问题讨论】:

添加 -fno-elide-constructors 有帮助吗? @Mat - 我会检查,但我今天很忙 也许你的函数是内联的。尝试使用 -O0 编译。 @whoplist - 看看这个问题。特别是。上面写着“问题是,我已经在编译器选项中指定了 -O0”。垫子可能是对的,也可能不是对的——尽管它是可耻的,但我还没来得及检查。 @Mat - 经过长时间的延迟,我终于有机会再次为此设置构建环境并检查您的建议 - 它有效。如果您可以将其发布为答案,我会接受。谢谢。 【参考方案1】:

正如 Mat 评论中所建议的,-fno-elide-constructors 选项解决了这个问题。

发布此答案是为了解决这个已经很古老的问题。如果 Mat 发布答案,我将删除它并将接受切换为那个。

【讨论】:

以上是关于如何从 gcov 获得更准确的结果?的主要内容,如果未能解决你的问题,请参考以下文章

如果我从 randomforest、gbm、svm、nnet 生成预测以获得更准确的预测,如何组合结果(预测)?

如何从charindex获得准确的结果? [关闭]

为了在 Android 中获得更准确的位置结果,使用 FusedLocationApi 和 FusedLocationProviderClient 哪个?

在获得准确结果之前,如何让 Geolocation watchPosition 运行?

如何通过 GPS_PROVIDER 获得更高的准确性

代码覆盖率未显示使用 Xcode + gcov 的结果