我正在使用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获得正常的覆盖率结果?
编辑
到目前为止,我想我需要以下附加标志…
我不确定这两者都需要,尽管我认为它们都禁用不同的特定类型的内联。
不过,我还没有找到任何方法来禁用返回值优化。这不是大问题,但有点烦人。当目标是100%覆盖率时,由于这个问题,一些真正达到100%的文件将被报告为更少。一个grep可以找到
#####
标记并显示它们是否适合
返回
声明,但您仍然需要做一些目视检查,以检查问题是否纯粹是一个RVO。