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

2023-11-23

我正在使用 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毕竟。当我发现问题时,我可以开始逐一寻找特定的优化标志,但这似乎是一件奇怪的事情。

那么 - 什么标志should我要指定以便从 gcov 获得合理的覆盖结果吗?

EDIT

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

  • -fno-默认内联
  • -fno-内联

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

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 gcov 获得更准确的结果? 的相关文章

随机推荐