c – 如何使用gcov抑制模板内联

前端之家收集整理的这篇文章主要介绍了c – 如何使用gcov抑制模板内联前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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

对不起噪音.

猜你在找的C&C++相关文章