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

时间:2015-09-29 08:54:10

标签: 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;

但是CppCheck给了我以下错误:

  

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

我不明白为什么。如果dataobjNULL,那么结果将是ERRORCODE_OK之后的其他内容。

4 个答案:

答案 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