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

Ste*_*314 10 gcc gcov

我正在使用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:}
Run Code Online (Sandbox Code Playgroud)

return考虑到之前的循环是否正在执行和退出,怎么可能根本不被执行?鉴于此临时变量属于类型,我认为我是这里返回值优化的受害者std::string.

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

-Wno-invalid-offsetof -g -O0 -fprofile-arcs -ftest-coverage
Run Code Online (Sandbox Code Playgroud)

我最好的猜测是,毕竟不是所有的优化都被禁用了-O0.当我发现问题时,我可以逐一寻找特定的优化标记,但这似乎是一件奇怪的事情.

那么-标志应该我是指定,以获得从gcov的理智的覆盖效果?

编辑

到目前为止,我认为我需要以下额外标志......

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

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

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

小智 3

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

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