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

2024-02-27

我对一些代码运行了 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]:(错误)可能为空 指针取消引用:x - 否则它 检查 x 是否为空是多余的 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 是一个非常有缺陷的工具。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 可能的空指针取消引用 的相关文章

随机推荐