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

11

我正在使用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 导致的。


2
添加-fno-elide-constructors有帮助吗? - Mat
@Mat - 我会查看,但我今天很忙。 - user180247
也许你的函数被内联了。尝试使用 -O0 编译。 - whoplisp
1
@whoplist - 看一下这个问题,特别是“问题在于,我已经在编译器选项中指定了 -O0”这部分。Mat 可能是对的,但可耻的是,我还没来得及检查。 - user180247
@Mat - 经过漫长的延迟,我终于有机会重新设置构建环境并检查您的建议 - 它有效。如果您可以将其发布为答案,我将接受它。谢谢。 - user180247
1个回答

3

如Mat在评论中建议的那样,选项-fno-elide-constructors可解决此问题。

这个答案是为了关闭这个已经古老的问题而发布的。如果Mat发布了一个答案,我会删除这个答案并将接受答案改为Mat的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接