我正在使用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-inline
虽然我不确定是否都需要这些标志,但我认为它们每个都禁用了不同类型的内联。
我还没有找到禁用返回值优化的方法。虽然这不是一个大问题,但有时会有一些文件实际上已经达到了100%的覆盖率,但由于这个问题而被报告为少于100%。使用 grep 命令可以找到 #####
标记并查看它们是否为 return
语句,但您仍需要进行一些视觉检查以确定问题是否纯粹是 RVO 导致的。