条件是冗余的,或者可能存在空指针解除引用

时间:2017-08-23 07:53:28

标签: c pointers sonarqube static-code-analysis cppcheck

我为嵌入式系统编写了一个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,否则我返回错误。

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

1 个答案:

答案 0 :(得分:4)

我查看了代码并立即使用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;