可能的空指针解引用-否则检查它是否为空是多余的
Possible null pointer dereference - otherwise it is redundant to check it against null
我有以下代码,这是正常工作:
int result = ERRORCODE_OK;
if (dataObj == NULL || dataObj->inputSignal == NULL)
{
result = ERRORCODE_MISSING_DATAOBJ;
}
if (result == ERRORCODE_OK && dataObj->spectrum == NULL) // CPP-Check error
{
result = Calculate(dataObj->inputSignal, .. );
}
return result;
但是CppCheck给了我以下错误:
可能的空指针解引用:
dataObj
-否则检查null是多余的。
我不明白为什么。如果dataobj
是NULL
,那么结果将是ERRORCODE_OK
以外的东西。
CppCheck检查不够深入,无法看到如果第一个条件成功,第二个条件不会被完全求值:
int result = ERRORCODE_OK;
if (dataObj == NULL || dataObj->inputSignal == NULL)
result = ERRORCODE_MISSING_DATAOBJ;
// Here, you can see that either dataObj!=NULL or result!=ERRORCODE_OK.
// But CppCheck can't!
if (result == ERRORCODE_OK && dataObj->spectrum == NULL)
result = Calculate(dataObj->inputSignal, .. );
return result;
有三种不同的安抚检查器的方法。首先,在第二个if
中重复检查dataObj
是否为非空。其次,将第二个if
更改为else if
:
int result = ERRORCODE_OK;
if (dataObj == NULL || dataObj->inputSignal == NULL)
{
result = ERRORCODE_MISSING_DATAOBJ;
}
else if (result == ERRORCODE_OK && dataObj->spectrum == NULL)
{
result = Calculate(dataObj->inputSignal, .. );
}
return result;
第三,一旦发现错误情况之一,立即返回:
if (!dataObj || !dataObj->inputSignal)
return ERRORCODE_MISSING_DATAOBJ;
if (dataObj->spectrum)
return ERRORCODE_OK;
return Calculate(dataObj->inputSignal, .. );
这是因为你在这里检查了NULL
变量:
if (dataObj == NULL || dataObj->inputSignal == NULL)
这使得分析器认为dataObj
在某些情况下可以是NULL
。
现在,Cppcheck无法知道代码背后的逻辑,它无法知道result == ERRORCODE_OK
确保dataObj != NULL
,所以它给你关于第二个if
的警告。基本上,它假设如果在第一个条件中检查一个变量是否有NULL
,那么在第二个条件中检查它是否有NULL
也是有意义的。
请注意,它说"可能空指针解引用",所以在你的情况下,它只是一个假阳性。
我的理论-您在第一个如果检查是否为空,那么被检查的假设dataObj可以为空,然后在第二个如果您使用dataObj而不检查它是否可以为空,那么被检查的是标记一个可能的实际问题。
你的代码设置结果结果,所以它永远不会真正发生....也许检查器不够聪明,没有注意到这个问题实际上不可能发生。
一般来说,这些工具检查NULL check statement
,这暗示他们这个对象可以为null,所以在null检查之后,如果你试图引用它将显示错误。如果可能的话,如果发生任何错误,返回或者将引用的代码放在不可触及的地方,这是一种良好的做法。你可以重新安排你的if
语句来实现这一点,或者在你的第一个if
中添加return
。
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 此宏中的if-else是否多余
- N3.3.7/1 节中的规则 3936 是否多余
- 可能的空指针解引用-否则检查它是否为空是多余的
- 是否有这么好的C编译器使得fortran成为一种多余的语言?