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