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

Gcc 如何从gcov获得更准确的结果?,gcc,gcov,Gcc,Gcov,我正在使用MingWGCC4.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 <

我正在使用MingWGCC4.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:}
我最好的猜测是并非所有的优化都被
-O0
禁用。当我注意到问题时,我可以一个接一个地寻找具体的优化标志,但这似乎是一件奇怪的事情

那么-为了从gcov获得合理的覆盖率结果,我应该指定哪些标志

编辑

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

  • -fno默认内联
  • -fno内联
我不确定它们是否都是必需的,尽管我认为它们各自禁用了不同的特定类型的内联


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

正如Mat的评论中所建议的那样,
-fno elide构造函数
选项修复了这个问题


发布此答案是为了解决这个早已过时的问题。如果Mat发布了答案,我将删除此项并将接受切换到该项。

添加-fno-elide构造函数是否有帮助?@Mat-我会检查,但我今天很忙,也许您的函数是内联的。试着用-O0编译。@whoplist-看看这个问题。特别是说“问题是,我已经在编译器选项中指定了-O0”。Mat可能是对的,也可能不是对的-尽管这很丢脸,我仍然没有时间去检查。@Mat-经过长时间的延迟,我终于有机会再次为它设置构建环境,并检查您的建议-它工作了。如果你能把它作为答案贴出来,我会接受的。谢谢
-Wno-invalid-offsetof -g -O0 -fprofile-arcs -ftest-coverage