Visual Studio 2015代码覆盖错误的文件

时间:2016-02-24 19:27:46

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

我正在使用VS 2015 Enterprise,我运行了一个通用的单元测试来分析代码覆盖率。我正在查看每个函数的覆盖块列表,它们通常看起来是正确的。但是,当我右键单击一个方法时 - > "转到源代码",在某些函数上它转到源代码中的正确位置(相关的.cpp文件),但在其他函数上它尝试打开头文件(源行号是正确的) ,但代码在.cpp文件中 - 而不是.h文件。这会影响源代码突出显示 - 在.cpp中没有突出显示VS认为的功能.h。我无法确定功能的任何差异(相同的可见性,相同的头文件和源文件),除了他们要调用的线程。知道为什么VS认为某些代码是.h而不是.cpp?

1 个答案:

答案 0 :(得分:0)

显然,尽管VS 2015支持C ++ 11功能non-static data member initializers(它确实可以正确编译),但覆盖工具会阻塞此功能。这是MCVE。我正在使用VS 14.0.24720.00更新1.要重现,请编译此程序,然后使用Generic Test运行代码覆盖。如果初始化x,则coverage工具会在.h文件中查找构造函数的代码。如果你取出= 0,它会正确识别.cpp中的构造函数定义。在我的产品代码中,它不是构造函数,但是覆盖工具认为在.h文件中定义的看似随机的函数。在我的例子中,修复只是将数据成员初始化移动到构造函数初始化列表。

//.h
class Test
{
public:
    Test();
    ~Test();

    void Func1();

    void Func2();

    void Func3();

    int x = 0;
};

// .cpp
#include "Test.h"

#include <iostream>

Test::Test()
{
    std::cout << "in Test()" << std::endl;
}

Test::~Test()
{
}

void Test::Func1()
{
    std::cout << "in Func1" << std::endl;

    Func2();

    Func3();
}

void Test::Func2()
{
    std::cout << "in Func2" << std::endl;
}

void Test::Func3()
{
    std::cout << "in Func3" << std::endl;
}