我正在用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。
添加-fno-elide-constructors是否有帮助? – Mat 2011-03-05 18:17:29
@Mat - 我会检查,但我今天很忙 – Steve314 2011-03-07 09:50:59
也许你的功能是内联的。尝试使用-O0进行编译。 – whoplisp 2011-07-03 18:11:30