可能的空指针取消引用 - 否则检查空值是多余的

S.S*_*ker 4 c++ cppcheck

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

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;
Run Code Online (Sandbox Code Playgroud)

但是CppCheck给了我以下错误:

可能的空指针取消引用:dataObj- 否则检查空值是多余的.

我不明白为什么.如果dataobjNULL,那么结果将是其他的东西ERRORCODE_OK.

Tob*_*ght 6

如果第一个条件成功,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;
Run Code Online (Sandbox Code Playgroud)

安抚检查员的三种替代方法是自己出现.首先,只需重复dataObj第二次非空的检查if.其次,将第二个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;
Run Code Online (Sandbox Code Playgroud)

第三,一旦发现其中一个错误情况,立即返回:

if (!dataObj || !dataObj->inputSignal)
    return ERRORCODE_MISSING_DATAOBJ;
if (dataObj->spectrum)
    return ERRORCODE_OK;
return Calculate(dataObj->inputSignal, .. );
Run Code Online (Sandbox Code Playgroud)