C++ VisualStudio为新的初始值设定项提供部分代码覆盖
我正在使用Visual Studio 2015 Update 3 我无法在这个简单的C++ VisualStudio为新的初始值设定项提供部分代码覆盖,c++,unit-testing,visual-studio-2015,code-coverage,C++,Unit Testing,Visual Studio 2015,Code Coverage,我正在使用Visual Studio 2015 Update 3 我无法在这个简单的单元测试中获得100%的代码覆盖率: TEST_METHOD(New) { int* test = new int(4); //shows the line as partially covered int* test2 = new int; //shows line as 100% covered } 如果语句也在测试函数调用的代码中,则会发生这种情况 与项目的默认设置相比,唯一更改的设置
单元测试中获得100%的代码覆盖率
:
TEST_METHOD(New)
{
int* test = new int(4); //shows the line as partially covered
int* test2 = new int; //shows line as 100% covered
}
如果语句也在测试函数调用的代码中,则会发生这种情况
与项目的默认设置相比,唯一更改的设置是/profile
开关,这是使任何代码覆盖率首先起作用所必需的
我注意到new
在没有初始值设定项的情况下使用时,会显示100%
覆盖率,但对于类,我通常会立即初始化它们,我想找到一种不降低代码覆盖率的方法
代码反汇编
int* test = new int(4); //shows the line as partially covered
0F951D53 push 4
0F951D55 call operator new (0F9512B2h)
0F951D5A add esp,4
0F951D5D mov dword ptr [ebp-0ECh],eax
0F951D63 cmp dword ptr [ebp-0ECh],0
0F951D6A je UnitTest1::UnitTest1::New+56h (0F951D86h)
0F951D6C mov eax,dword ptr [ebp-0ECh]
0F951D72 mov dword ptr [eax],4
0F951D78 mov ecx,dword ptr [ebp-0ECh]
0F951D7E mov dword ptr [ebp-100h],ecx
0F951D84 jmp UnitTest1::UnitTest1::New+60h (0F951D90h)
0F951D86 mov dword ptr [ebp-100h],0
0F951D90 mov edx,dword ptr [ebp-100h]
0F951D96 mov dword ptr [test],edx
int* test2 = new int; //shows line as 100% covered
0F951D99 push 4
0F951D9B call operator new (0F9512B2h)
0F951DA0 add esp,4
0F951DA3 mov dword ptr [ebp-0F8h],eax
0F951DA9 mov eax,dword ptr [ebp-0F8h]
0F951DAF mov dword ptr [test2],eax
查看代码,我猜测jmp
语句会导致代码覆盖率分析工具将某些语句视为未命中。您似乎有一个选项,这意味着new
始终表现为new(nothrow)
(换句话说,如果分配失败,new
返回nullptr
)
程序集正在检查operator new
是否返回了null ptr(如果是,则不在返回的地址存储4)。您需要测试分配失败的情况,以获得完全覆盖。在C++中,程序集看起来像:
int * test;
int * tmp = operator new(sizeof(int));
if (tmp != nullptr) {
*tmp = 4;
test = tmp;
} else {
test = nullptr;
}
编辑
啊哈!在Microsoft中,解释为new生成的代码一直在测试null返回,以防您链接到nothrow
版本。有了VC2015,他们提供了一个选项,可以说“不用麻烦这么做,new
将抛出,它将永远不会返回nullptr
因此,为了避免不必要的分支,在编译选项中添加:/Zc:throwingNew
。忽略前面的注释。我混淆了“new与initializer”和“array new”"!试着查看组件,看看是否有任何意外的跳转或其他情况。@MartinBonner我刚刚添加了它,我怀疑两次跳转中的一次可能是原因,但我不知道如何修复它。因此没有简洁的方法将其标记为完全覆盖?我已经在测试将nullptr
发送到我正在使用的函数的情况。谢谢,我已经搜索了Microsoft网站,但找不到这个,您的Google fu处于不同的级别。我接受了你的回答。