我正在使用GCC 4.9和GCOV来获得代码和分支覆盖.但是,对于我的C代码,分支覆盖的结果完全没用.尽管使用了我所知道的所有-fno – * – 内联标志,但似乎GCC内联模板.
这是一个说明问题的小示例应用程序:
#include <string> #include <iostream> using namespace std; int main() { string foo; foo = "abc"; cout << foo << endl; }
我用g -O0编译程序-fno-inline -fno-inline-small-functions -fno-default-inline -coverage -fprofile-arcs test.cpp -o test
运行测试后,gcovr -r. -b打印:
------------------------------------------------------------------------------ GCC Code Coverage Report Directory: . ------------------------------------------------------------------------------ File Branches Taken Cover Missing ------------------------------------------------------------------------------ test.cpp 14 7 50% 7,8,9,10 ------------------------------------------------------------------------------ TOTAL 14 7 50% ------------------------------------------------------------------------------
我们的主要功能中没有一个分支.例如,第7行包含字符串foo;.它似乎是std :: basic_string< ...>的构造函数在其中有一些if语句,但在查看main的覆盖范围时,这不是有用的信息.
问题是所有这些内联分支总结,并且为我的实际单元测试计算的分支覆盖率大约为40%.我对我的代码的分支覆盖感兴趣,而不是我在C标准库中有多少分支.
有没有办法完全关闭编译器中的内联或告诉GCOV不考虑内联分支?我在GCOV主页或其他有关该主题的地方找不到任何指南.
任何帮助深表感谢.
解决方法
那么,你应该经常仔细检查你的期望.非常感谢@Useless指出我自己的gcov输出.但是你不太对劲:分支不归属于test.cpp文件.使用-k运行gcovr并查看所有中间文件,表明gcov正确生成了#usr #include#c#4.9#bits#basic_string.h.gcov等文件,显示了C标准库方面的覆盖范围.
但是,test.cpp中所有分支的原因都不是内联.这是例外.由于潜在的异常(例如std :: bad_alloc),每次调用标准库都是一个分支.向编译器标志添加-fno-exceptions会提供以下输出:
------------------------------------------------------------------------------ GCC Code Coverage Report Directory: . ------------------------------------------------------------------------------ File Branches Taken Cover Missing ------------------------------------------------------------------------------ test.cpp 4 2 50% 10 ------------------------------------------------------------------------------ TOTAL 4 2 50% ------------------------------------------------------------------------------
通过cat foo.cpp.gcov深入挖掘gcov输出:
-: 0:Source:test.cpp -: 0:Graph:/home/neverlord/gcov/test.gcno -: 0:Data:/home/neverlord/gcov/test.gcda -: 0:Runs:1 -: 0:Programs:1 -: 1:#include <string> -: 2:#include <iostream> -: 3: -: 4:using namespace std; -: 5: function main called 1 returned 100% blocks executed 100% 1: 6:int main() { 1: 7: string foo; call 0 returned 1 1: 8: foo = "abc"; call 0 returned 1 1: 9: cout << foo << endl; call 0 returned 1 call 1 returned 1 call 2 returned 1 function _GLOBAL__sub_I_main called 1 returned 100% blocks executed 100% function _Z41__static_initialization_and_destruction_0ii called 1 returned 100% blocks executed 100% 4: 10:} call 0 returned 1 branch 1 taken 1 (fallthrough) branch 2 taken 0 branch 3 taken 1 (fallthrough) branch 4 taken 0
对不起噪音.