Visual Studio为新的初始化程序提供部分代码覆盖

时间:2017-07-11 06:36:36

标签: c++ unit-testing visual-studio-2015 code-coverage

我正在使用Visual Studio 2015 Update 3

我无法在这个简单的Unit Test上获得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在没有initializer的情况下使用时显示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语句会导致代码覆盖率分析工具看到某些语句未被命中。

1 个答案:

答案 0 :(得分:2)

您似乎有一个选项,这意味着new始终表现为new(nothrow)(换句话说,如果分配失败,new会返回nullptr

程序集正在检查operator new是否返回了nullptr(如果是,则不在返回的地址处存储4)。您需要测试分配失败的情况才能完全覆盖。在C ++中,程序集如下所示:

    int * test;
    int * tmp = operator new(sizeof(int));
    if (tmp != nullptr) {
        *tmp = 4;
        test = tmp;
    } else {
        test = nullptr;
    }

修改

啊哈哈!在this blog post Microsoft解释说,生成的new代码一直在测试null返回,以防你链接到nothrow版本。使用VC2015,他们提供了一个选项,说“不要这么做,new会抛出,它永远不会返回nullptr

因此,为避免不必要的分支,请在编译选项中添加:/Zc:throwingNew。 (这也有助于提高性能。)