我正在使用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可以找到#####
标记并显示它们是否用于return
语句,但您仍需要进行一些目视检查以检查问题是否纯粹是RVO。
答案 0 :(得分:3)
根据Mat的评论中的建议,选项-fno-elide-constructors
解决了这个问题。
这个答案被贴出来让这个已经很古老的问题关闭了。如果Mat发布了答案,我会删除它并将接受切换为。