我有以下代码,它正常工作:
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
- 否则检查空值是多余的。
我不明白为什么。如果dataobj
为NULL
,那么结果将是ERRORCODE_OK
之后的其他内容。
答案 0 :(得分: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;
安抚检查员的三种替代方法。首先,重复检查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;
第三,一旦发现其中一个错误案例,就立即返回:
if (!dataObj || !dataObj->inputSignal)
return ERRORCODE_MISSING_DATAOBJ;
if (dataObj->spectrum)
return ERRORCODE_OK;
return Calculate(dataObj->inputSignal, .. );
答案 1 :(得分:4)
之所以会发生这种情况,是因为您在此检查NULL
的变量:
if (dataObj == NULL || dataObj->inputSignal == NULL)
这使得分析师认为dataObj
在某些情况下可以NULL
。
现在,Cppcheck无法知道您的代码背后的逻辑,它无法知道result == ERRORCODE_OK
确保dataObj != NULL
,因此它会向您发出有关您的第二个{{1}的警告}}。基本上它假设如果你在第一个条件中检查if
的变量,那么它也会在第二个条件下检查NULL
。
请注意,它显示“可能的空指针取消引用”,因此在您的情况下,它只是一个误报。
答案 2 :(得分:2)
我的理论 - 你正在检查第一个中的null,如果这样,则检查假定dataObj可以为null,然后在第二个中如果你使用dataObj而不检查它是否可以为null,那么被检查标记可能的实际问题。
你的代码设置结果结果虽然它实际上永远不会发生....也许检查器不够聪明,没有注意到问题实际上不会发生。
答案 3 :(得分:1)
通常这些工具检查NULL check statement
,提示他们这个对象可以为null,所以在null检查之后你是否试图引用它会显示错误。如果可能的话,如果发生任何错误,或者保留引用代码不可及,则最好返回。您可以重新排列if
语句以实现该目标,或在return
if
中添加CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync
。