条件是多余的,或者可能存在空指针取消引用

Posted

技术标签:

【中文标题】条件是多余的,或者可能存在空指针取消引用【英文标题】:Either the condition is redundant or there is possible null pointer dereference 【发布时间】:2017-08-23 07:53:27 【问题描述】:

我为嵌入式系统编写了一个 C 代码,当我使用 SonarQube 和 CppCheck 插件执行代码分析时,我遇到了这个错误:

要么条件是多余的,要么可能存在空指针解引用:指针。

这是有错误的代码:

ReturnCode_e SocketTcpSecureWrite( SocketHandle_t socketHandle, 
                                   char* dataBuffer, 
                                   uint16_t dataBufferLen, uint16_t* byteTransmitted )

    uint32_t bytes = 0;
    ReturnCode_e opResult = SSL_WRITE_ERROR;

    *byteTransmitted = 0;

    if( dataBuffer == NULL || byteTransmitted == NULL )
    
        return WRONG_PARAMETER;
    

    if( SEND_SOCKET( socketHandle, dataBuffer, dataBufferLen, 0, &bytes ) == SUCCESS )
    
        *byteTransmitted = bytes;
        opResult = SUCCESS;
    

    return opResult;

我不明白为什么指针一致性检查显示为错误。 我想在执行函数之前验证指针不为NULL,否则返回错误。

这是检查指针一致性的正确方法吗?

【问题讨论】:

代码看起来不错,你确定这是生成警告的确切代码吗? 显示其余代码。 CppCheck 也会抱怨特定的行... 我添加了从 SonarQube 捕获的屏幕截图 我已将其标记为重复。我认为您在 if 语句(返回)之后使用 byteTransmitted 。 CppCheck 分析还不够深入。这是误报。 @AndreKampling 这不是误报:问题是*byteTransmitted = 0; 之前 NULL 检查。 【参考方案1】:

我查看了代码并检查了它,立即使用 PVS-Studio 并发出警告:

V595:“byteTransmitted”指针在针对 nullptr 进行验证之前已被使用。检查行:39、41.consoleapplication1.cpp 39

确实,让我们看看这段代码:

*byteTransmitted = 0;

if( dataBuffer == NULL || byteTransmitted == NULL )

一开始,指针byteTransmitted 被取消引用,然后才针对NULL 进行验证。这是一个错误。因此,所有分析仪都抱怨它是正确的。首先验证是否正确,然后才使用指针:

if( dataBuffer == NULL || byteTransmitted == NULL )

  return WRONG_PARAMETER;


*byteTransmitted = 0;

【讨论】:

我认为 CppCheck 仍然会发出警告,因为我在上面的 cmets 中已经提到过:Possible null pointer dereference - otherwise it is redundant to check it against null。不过,您的回答解决了他的代码的问题! @PaulR:是的,当然!但我的意思是CppCheck在更正后也会发出警告。 @AndreyKarpov:现在我明白错误背后的原因了!天气晴朗!感谢您测试我的代码 @AndreKampling 我是一名 Cppcheck 开发人员。我不同意“CppCheck 在更正后也会发出警告”。至少不适用于此示例代码。也许对于您的真实代码。那么你的真实代码中可能还有一个错误。 @Daniel:您好,感谢您参与讨论。我发布的链接是怎么回事?这里的情况是一样的:根据 NULL 检查变量 --> 如果 NULL 则返回 --> 之后使用该变量。我有什么不对吗?这是很久以前修好的吗?

以上是关于条件是多余的,或者可能存在空指针取消引用的主要内容,如果未能解决你的问题,请参考以下文章

什么是取消引用可能的空指针?

如何在声纳中解决这个“可能的空指针取消引用”关键问题?

cppcheck 取消引用空指针

cppcheck 空指针取消引用,但它实际上可以变为空

实例变量访问(通过 self)导致空指针取消引用

不评估应用了 sizeof 的表达式是不是使得在 C++ 中取消引用 sizeof 内的空指针或无效指针是合法的?