gpt4 book ai didi

c++可能的空指针取消引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:41 24 4
gpt4 key购买 nike

我对一些代码运行了 cppcheck 以查找可能的运行时错误。并且它报告了以下情况下可能的空指针取消引用:

Foo* x = ... //defined somewhere

...

Foo* y(x); //possible null pointer dereference.

编辑:更好的例子

for( int i = 0; i < N; i++ )
{
Foo* x( ArrayOfObjsContainingFooPtr[i].FooPtr ); // line 3
if( !x ) // line 4
continue;
}

来自 cppcheck 的错误消息:

[C:\file.cpp:3]: (error) Possible null pointer dereference: x - otherwise it is redundant to check if x is null at line 4

但我不知道这怎么可能。

最佳答案

我真的很惊讶你收到了那个警告。对我来说,它的作用恰恰相反。在 Linux 中使用从源代码编译的 cppcheck 1.46.1。这很好:

struct Foo {
int x;
};

struct Obj {
Foo *FooPtr;
};

#define N 10

static Obj ArrayOfObjsContainingFooPtr[N];

int main() {
for( int i = 0; i < N; i++ ) {
Foo* x( ArrayOfObjsContainingFooPtr[i].FooPtr ); // line 3
if( !x ) // line 4
continue;
}
}

现在,对于 this 循环体,根据 cppcheck,它也是“正常的”,尽管如果我真的尝试运行它,它会出现段错误,显然:

Foo* x( ArrayOfObjsContainingFooPtr[i].FooPtr ); // line 3
if (x->x == 0)
break;
if( !x ) // line 4
continue;

即使这样也“很好”:

int main() {
Foo *p = 0;
if (p->x == 0)
return 1;

这最终会生成“可能的”空指针解引用。可能,对:

int main() {
Foo *p = 0;
p->x = 0;

有趣的是,虽然这完全等同于前面的示例,但给出了明确的(不是“可能的”)空指针取消引用:

int main() {
Foo *p = 0;
if ((*p).x == 0)
return 1;

结论:cppcheck 是一个非常有问题的工具。

关于c++可能的空指针取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4474357/

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