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

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 给我以下错误:

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

我不明白为什么。如果 dataobjNULL,那么结果将是 ERRORCODE_OK

我的理论 - 您在第一个中检查是否为空,如果这样检查假设 dataObj 可以为空,然后在第二个中如果您使用 dataObj 而不检查它是否可以为空所以检查标记可能真正的问题。

尽管您的代码设置了结果结果,但它永远不会真正发生....也许检查器不够聪明,无法注意到问题实际上不会发生。

一般来说,这些工具会检查 NULL check statement,这会提示他们此对象可以为 null,因此在检查 null 之后是否尝试引用它会显示错误。如果可能发生任何错误,最好 return 或将引用代码放在遥不可及的地方。您可以重新排列您的 if 语句来实现这一点,或者在您的第一个 if .

中添加 return

发生这种情况是因为您在此处检查 NULL 的变量:

if (dataObj == NULL || dataObj->inputSignal == NULL)

这使得分析器认为 dataObj 在某些情况下可以是 NULL

现在,Cppcheck 无法知道代码背后的逻辑,它无法知道 result == ERRORCODE_OK 确保 dataObj != NULL,因此它会向您发出有关第二个 if。基本上它假设如果您在第一个条件中检查变量 NULL,那么在第二个条件中检查它也是有意义的 NULL

请注意,它说“可能 空指针取消引用”,所以在你的情况下它只是一个误报。

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;

第三,return一旦发现其中一种错误情况:

if (!dataObj || !dataObj->inputSignal)
    return ERRORCODE_MISSING_DATAOBJ;
if (dataObj->spectrum)
    return ERRORCODE_OK;
return Calculate(dataObj->inputSignal, .. );