【问题标题】:Null Pointer Dereference issue not detected when the pointer is returned by another function另一个函数返回指针时未检测到空指针取消引用问题
【发布时间】:2015-11-13 13:09:01
【问题描述】:

我使用 SonarQube(5.1 和 cppecheck 1.70)来分析 C 代码。 在以下示例中,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++
  • @CppNITR:考虑到使用了cppcheck,C++ 标签是可以理解的——但确实是错误的。

标签: c pointers sonarqube cppcheck


【解决方案1】:

我是一名 Cppcheck 开发人员。

我很惊讶 Cppcheck 没有检测到这一点。

我在上游创建了这张票: http://trac.cppcheck.net/ticket/7132

谢谢!如果您发现更多误报,请告诉我。

【讨论】:

    【解决方案2】:

    SonarCube 进行静态代码分析。这是运行时故障。

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

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

    【讨论】:

    • MightHalt 是一条红鲱鱼。静态分析应该可以捕捉到这一点。
    • @this:如果您不知道,这是对停机问题的引用。静态分析无法捕捉到它,这是一个数学事实。
    • 我认为我的评论措辞不佳。让我解决这个问题:就这个问题而言,MightHalt 是一个红鲱鱼。静态分析应该抓住 SaidSsu 提出的例子。你没有提供这个问题的答案。
    【解决方案3】:

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

    根据C,不应取消引用 NULL 指针。虽然它没有说明如果取消引用会发生什么。

    【讨论】:

    • 没错,但这不是问题所在。 SonarCube是一个查找错误的工具,这是一个明显的错误,为什么它没有找到错误?
    猜你喜欢
    • 2011-07-18
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多