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 取消引用空指针的主要内容,如果未能解决你的问题,请参考以下文章