C++ VisualStudio为新的初始值设定项提供部分代码覆盖

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 } 如果语句也在测试函数调用的代码中,则会发生这种情况 与项目的默认设置相比,唯一更改的设置

我正在使用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
}
如果语句也在测试函数调用的代码中,则会发生这种情况

与项目的默认设置相比,唯一更改的设置是
/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处于不同的级别。我接受了你的回答。