cppcheck 取消引用空指针

Posted

技术标签:

【中文标题】cppcheck 取消引用空指针【英文标题】:cppcheck dereference null pointer 【发布时间】:2019-11-21 18:19:58 【问题描述】:

我知道 cppcheck 可以检查对变量的空指针的取消引用。例如,这会触发 cpp 检查:

int* a = NULL;
*a = 5;

是否可以配置 cppcheck 以便它也验证函数返回的指针?像这样的:

int* foo()  return NULL; 
void main()

  int a = *foo();

如果可能的话,它是否也适用于智能指针?

【问题讨论】:

第一个不是空指针,是未初始化的指针 你试过用 cppcheck 检查代码吗? 别忘了在 C++ 中你应该使用nullptr 除非cppcheck 可以推断出函数总是返回NULL,否则这很难提前看到。 一般没有。首先函数体可以在不同的编译单元中。其次 - 它只适用于非常微不足道的情况,因此它的价值为零。 【参考方案1】:

使用最新版本的 Cppcheck (https://github.com/danmar/cppcheck/commit/e6d692d9605850cf98153a4825e353898b9320a2) 运行您的示例会给出

$ g++ -c nullPointer.cpp && cppcheck --enable=all --inconclusive nullPointer.cpp
Checking nullPointer.cpp ...
nullPointer.cpp:4:14: error: Null pointer dereference: foo() [nullPointer]
 int a = *foo();
             ^
nullPointer.cpp:2:0: style: The function 'f' is never used. [unusedFunction]

$ more nullPointer.cpp
int * foo(void) return 0;
int f(void)

    int a = *foo();
    return a;

你用的是什么版本?

更新:同时在 Cppchecks 单元测试套件中添加了一个测试:https://github.com/danmar/cppcheck/commit/fd900ab8b249eec37df706f338c227f2a9adb3ef

更新 2: 关于智能指针: 发现了一些与智能指针有关的问题。 例如对于这个 C++ 代码:

#include <memory>
int main()

    std::shared_ptr<int> p(nullptr);
    int a = *p;
    return a;

Cppcheck 发出错误信息:

./cppcheck fn_nullptr.cpp
Checking fn_nullptr.cpp ...
fn_nullptr.cpp:5:14: error: Null pointer dereference: p [nullPointer]
    int a = *p;
             ^
fn_nullptr.cpp:4:28: note: Assignment 'p(nullptr)', assigned value is 0
    std::shared_ptr<int> p(nullptr);
                           ^
fn_nullptr.cpp:5:14: note: Null pointer dereference
    int a = *p;
             ^

但目前通过智能指针返回空指针不会产生错误消息。 现在有一张票要求这个:https://trac.cppcheck.net/ticket/9496

【讨论】:

以上是关于cppcheck 取消引用空指针的主要内容,如果未能解决你的问题,请参考以下文章

cppcheck 空指针取消引用:m_buffer - 否则检查它是不是为空是多余的

如何通过 Cppcheck 解释 Null 指针取消引用?

条件是多余的,或者可能存在空指针取消引用

C: Cppcheck : 可能的空点取消引用

什么是取消引用可能的空指针?

在 sizeof 操作中取消引用空指针是不是有效[重复]