如果函数采用引用参数,则代码覆盖缺少分支

Din*_*nda 5 c++ code-coverage reference

我有一个以下函数,它接受一个引用参数:

#include <iostream>

class A { static void TestA(const int &y) };

void A::TestA(const int &y) { std::cout << y; }

int main()
{
   A::TestA(2);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的(lcov)代码覆盖率与谷歌单元测试,它是说缺少一个具有TestA()函数的分支,并且符号列表添加了stack_chk_fail符号.如果我将函数参数更改为非引用,则覆盖率为100%.

我正在使用g ++编译器.

我错过了什么吗?

谢谢

Max*_*hof 5

编译器内联Testmain(因为这是一个很好的编译器做什么).但是,它还必须创建代码,Test因为它具有外部链接.实际上,函数的代码存在两次:一旦内联到main代码中Test,链接器就可以与其他编译单元链接.

如果您的编译器对于内联函数(hello MSVC?)的代码属性(在调试符号中)是坏的,那么您的分析器将准确地给出您看到的结果:执行程序不会导致覆盖,Test因为没有二进制文件的那一部分执行(即main)有任何行归属Test.

更改参数类型可能会影响内联,但更可能会更改调试符号的生成方式.

要验证这一点,请使用带有断点的调试器逐步执行该程序Test.如果在运行时未触发该断点main,则您的覆盖工具也不会看到该行的覆盖范围.或者,如果您确实需要,请手动查看调试符号以查看哪些行具有属性.在Visual Studio中,您还可以在调试时查看反汇编(它将显示相关的代码行).

由于上述原因,如果使用调试版本进行覆盖运行(例如,不会发生内联),通常会获得更可靠的覆盖结果.