代码之家  ›  专栏  ›  技术社区  ›  Steve314

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

  •  10
  • Steve314  · 技术社区  · 15 年前

    我正在使用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默认内联
    • -FNO内联

    我不确定这两者都需要,尽管我认为它们都禁用不同的特定类型的内联。

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

    1 回复  |  直到 14 年前
        1
  •  3
  •   Igor Klimer    14 年前

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

    这个答案是为了解决这个已经很古老的问题而发布的。如果mat发布了一个答案,我将删除这个并将accept切换到那个。