Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 代码覆盖率(Lcov)错误地显示100%覆盖率_C++_Code Coverage_Lcov - Fatal编程技术网

C++ 代码覆盖率(Lcov)错误地显示100%覆盖率

C++ 代码覆盖率(Lcov)错误地显示100%覆盖率,c++,code-coverage,lcov,C++,Code Coverage,Lcov,我有以下设置(使用g++10和lcov1.14): 与 但是结果输出错误地显示了100%的覆盖率,即使我的代码跳过了两个函数(1个构造函数&1个value()function)是否缺少任何设置? 因为函数是。在类/结构定义中定义成员函数时,它是一个隐式内联函数。编译器仅在调用内联函数时为其生成代码。lcov使用GCC内置的gcov覆盖机制,该机制基于在生成的机器代码中插入计数器。因此: 编译器不会为这些函数生成代码 因此gcov不知道这些函数的存在 因此lcov不知道这些函数的存在 这是所有

我有以下设置(使用
g++
10和
lcov
1.14):

但是结果输出错误地显示了100%的覆盖率,即使我的代码跳过了两个函数(1个构造函数&1个
value()
function)是否缺少任何设置?

因为函数是。在类/结构定义中定义成员函数时,它是一个隐式内联函数。编译器仅在调用内联函数时为其生成代码。lcov使用GCC内置的gcov覆盖机制,该机制基于在生成的机器代码中插入计数器。因此:

  • 编译器不会为这些函数生成代码
  • 因此gcov不知道这些函数的存在
  • 因此lcov不知道这些函数的存在
这是所有gcov/lcov/gcovr类型覆盖工具的系统性限制

如果要确保这些工具能够识别函数何时被发现,请确保它不是内联的(并且具有外部链接),或者确保测试包含对该函数的调用(即使调用从未执行)。或者使用不同的覆盖率工具来解析源代码本身

< C++中的概念不是指内联优化,而是与链接和一个定义规则(ODR)相关。函数/对象的定义必须在使用它们的所有编译单元中可见,链接器可以合并其他冲突的定义(ODR的例外)。另一方面,如果不使用内联函数,编译器通常不会为其发出代码。当使用
inline
关键字标记函数或在类/结构体中定义函数时,函数可以是内联的:

struct示例{
void inline_函数(){…}
void还_inline();
void not_inline();
};
内联void示例::也_inline(){…}
void示例::not_inline(){…}

谢谢。我如何(a)确保函数没有内联,或者(b)确保我的测试包含“对该函数的调用,即使调用从未执行”@Phil ZXX我编辑了答案,简短地讨论了C++的“内联”概念。(a) 您可以在类中声明函数签名,并在外部定义
int&Container::value(){…}
。(b) 对不起,我可能把事情弄得太复杂了。如果您在某处调用该函数,那么将生成该函数的代码。当然,你也可以为它写一个测试用例,所以这个建议在实践中并没有多大帮助…
g++ SampleScript.cpp -g -O0 -fprofile-arcs -ftest-coverage -o MyScript
./MyScript

lcov -d . -c -o coverage.info --rc lcov_branch_coverage=1
genhtml coverage.info -o cov_out --legend --branch-coverage
/* SampleScript.cpp */

class Container
{
public:
    Container()
        : m_value(0) { }

    Container(int value)
        : m_value(value) { }

    int& value()
    {
        return m_value;
    }

    const int& value() const
    {
        return m_value;
    }

private:
    int m_value;
};

int main()
{
    const Container c;
    return c.value();
}