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 ++编译器.
我错过了什么吗?
谢谢
编译器内联Test成main(因为这是一个很好的编译器做什么).但是,它还必须创建代码,Test因为它具有外部链接.实际上,函数的代码存在两次:一旦内联到main代码中Test,链接器就可以与其他编译单元链接.
如果您的编译器对于内联函数(hello MSVC?)的代码属性(在调试符号中)是坏的,那么您的分析器将准确地给出您看到的结果:执行程序不会导致覆盖,Test因为没有二进制文件的那一部分执行(即main)有任何行归属Test.
更改参数类型可能会影响内联,但更可能会更改调试符号的生成方式.
要验证这一点,请使用带有断点的调试器逐步执行该程序Test.如果在运行时未触发该断点main,则您的覆盖工具也不会看到该行的覆盖范围.或者,如果您确实需要,请手动查看调试符号以查看哪些行具有属性.在Visual Studio中,您还可以在调试时查看反汇编(它将显示相关的代码行).
由于上述原因,如果使用调试版本进行覆盖运行(例如,不会发生内联),通常会获得更可靠的覆盖结果.