当指针由另一个函数返回时,未检测到空指针取消引用问题。

4
我使用SonarQube(5.1与cppecheck 1.70)来分析C代码。 在以下示例中,存在Null Pointer Dereference问题,应该由SonarQube或Cppcheck(由Sonar使用)检测到。但是,SonarQube没有发现任何问题,Cppcheck也没有报告任何问题。
struct s1
{ 
    char c1;
    char c2;
};

struct s1 * toto1(void)
{ 
    return NULL;
}

void toto2(void)
{ 
    struct s1* my_st=NULL;
    my_st = toto1();
    my_st->c1 = 1;
    my_st->c2 = 0;
    return;
}

在这种情况下,对于这条规则(空指针不应被取消引用),是否有任何限制?

这是完全的C语言,请不要添加C++。 - DevInd
1
@CppNITR:考虑到使用了cppcheck,C++标签是可以理解的,但确实是错误的。 - MSalters
3个回答

2

我是Cppcheck的开发者。

我很惊讶Cppcheck没有检测到这个问题。

我已经在上游创建了这个票据: http://trac.cppcheck.net/ticket/7132

谢谢!如果你发现更多的错误遗漏,请告诉我。


0

SonarCube 进行静态代码分析。这是一次运行时失败。

要了解为什么这对静态分析是个问题,请参见以下修改:

struct s1 * toto1(void)
{
    MightHalt(); /* good luck with your static analysis */ 
    return NULL;
}

MightHalt是一个误导。静态分析应该能够捕捉到这个问题。 - this
1
如果您不知道,这是指停机问题。静态分析无法捕捉到它,这是数学事实。@this - MSalters
我觉得我的评论表述不太好。让我来修正一下:对于这个问题而言,MightHalt是一个红鲱鱼。静态分析应该能够捕捉到SaidSsu提出的例子。你没有回答这个问题。 - this

-1

一个NULL指针并不是指向内存位置0或其他什么地方的指针。它只是一个指向的指针。它只是一个特殊的指针,不指向任何有效的东西。

根据C的规定,NULL指针不应被解引用。虽然它没有说明如果被解引用会发生什么。


2
是的,但这不是问题所在。SonarCube是一种查找错误的工具,这是一个明显的错误,为什么它没有发现这个错误呢? - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接