静态分析 - 覆盖率和C++:堆(使用新)与堆栈上分配

static analysis - Coverity and C++: heap (with new) vs. on-stack allocation

本文关键字:堆栈 分配 覆盖率 C++ 静态分析      更新时间:2023-10-16

我正在使用覆盖性(5.5.1((以及其他(来强化我的代码。我偶然发现了一个问题,现在我怀疑我的覆盖设置不完整。看看这个例子:

class A
{
    int _a,_b;
public:
    A(int b) : _a(_b), _b(b)
    { }
};
int main(void)
{
    A *a1 = new A(5);
    delete a1;
    A a2(5);
    return 0;
}

可以看出,我正在使用_b在用b初始化之前初始化_a。在这个问题中,我了解到编译器或任何其他工具发出这样的警告会"很高兴"。

与我现在发现的问题的最初理解相反,覆盖率实际上会发出完全匹配的缺陷(UNINT(,但仅在堆栈上分配时,而不是在使用new创建时。因此,在我的main函数中,我收到A a2(5)的警告,但没有收到A *a1 = new A(5)的警告。

在我看来,覆盖率在使用new时处理对构造函数的调用与在堆栈上创建对象时不同。

在我的覆盖配置中,我忽略了什么吗?在堆上分配时,我可以做些什么来显示警告?

事实证明,根据支持,这是 Coverity 中的一个已知错误(即使在当前版本中(。修复程序可能会随明年夏天发布的版本一起提供。

该错误列在初始化前构造函数中使用的 ID:50128 UNINIT FN: 成员下,因此在修复和发布时将放入发行说明中。