可能的空指针取消引用 - 否则检查它是否为空指针是多余的
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.
我不明白为什么。如果 dataobj
是 NULL
,那么结果将是 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, .. );
我有以下代码,可以正常工作:
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.
我不明白为什么。如果 dataobj
是 NULL
,那么结果将是 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, .. );