可能的空指针解引用-否则检查它是否为空是多余的

Possible null pointer dereference - otherwise it is redundant to check it against null

本文关键字:是否 多余 检查 空指针 引用      更新时间:2023-10-16

我有以下代码,这是正常工作:

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是多余的。

我不明白为什么。如果dataobjNULL,那么结果将是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