gpt4 book ai didi

c++ - 如果函数采用引用参数,则代码覆盖率缺少分支

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:38 25 4
gpt4 key购买 nike

我有一个带引用参数的函数:

#include <iostream>

class A { static void TestA(const int &y) };

void A::TestA(const int &y) { std::cout << y; }

int main()
{
A::TestA(2);
return 0;
}

在我的(lcov)谷歌单元测试代码覆盖中,它说缺少一个带有 TestA() 函数的分支,并且符号列表添加了一个 stack_chk_fail 符号。如果我将函数参数更改为非引用,则覆盖率为 100%。

我正在使用 g++ 编译器。

我错过了什么吗?

谢谢

最佳答案

编译器将 Test 内联到 main 中(因为这是一个好的编译器所做的)。但是,它也必须Test 创建代码,因为它有外部链接。实际上,该函数的代码存在两次:一次内联到 main 中,一次在链接器可以与其他编译单元链接的 Test 的代码中。

如果你的编译器对内联函数(你好 MSVC?)的代码属性(在调试符号中)不好,那么你的探查器会给你你看到的结果:执行程序不会导致覆盖 Test 因为执行的二进制文件(即 main)没有任何行归因于 Test

改变参数类型可能会影响内联,但更有可能改变调试符号的生成方式。

要验证这一点,请使用调试器逐步执行程序,并在 Test 中设置一个断点。如果在运行 main 时没有遇到该断点,您的覆盖工具也不会看到该行的覆盖。或者,如果您确实需要,请手动查看调试符号以查看哪些行具有属性。在 Visual Studio 中,您还可以在调试时查看反汇编(它将显示关联的代码行)。

由于上述原因,如果您使用调试构建进行覆盖运行(例如,不会发生内联),您通常会获得更可靠的覆盖结果。

关于c++ - 如果函数采用引用参数,则代码覆盖率缺少分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54417884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com