2010-08-08 30 views
10

我正在用gingw gcc 4.4.0试验gcov。我得到了一些有趣但奇怪的结果。一个常见的模式是这样的......如何从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不能在所有的,因为在循环之前显然是既执行和退出exected?考虑到这个临时变量的类型为std::string,我认为我是这里返回值优化的受害者。

问题是,我已经在编译器选项中指定了-O0。这是我使用的是精确的编译器标志...

-Wno-invalid-offsetof -g -O0 -fprofile-arcs -ftest-coverage 

我最好的猜测是,并不是所有的优化是由毕竟-O0禁用。当我发现问题时,我可以开始逐个搜索特定的优化标志,但这似乎是一件很奇怪的事情需要做。

那么 - 什么标记应该我指定为了从gcov得到理智的覆盖结果?

编辑

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

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

我不确定这些都是需要的,但我认为他们都禁用了不同的特定类型的内联。

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

+2

添加-fno-elide-constructors是否有帮助? – Mat 2011-03-05 18:17:29

+0

@Mat - 我会检查,但我今天很忙 – Steve314 2011-03-07 09:50:59

+0

也许你的功能是内联的。尝试使用-O0进行编译。 – whoplisp 2011-07-03 18:11:30

回答

3

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

这个答案发布是为了让这个古老的问题关闭。如果Mat发布了答案,我会删除它并将接受切换为该答案。

相关问题