条件是多余的,或者可能存在空指针取消引用
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 则返回 --> 之后使用该变量。我有什么不对吗?这是很久以前修好的吗?以上是关于条件是多余的,或者可能存在空指针取消引用的主要内容,如果未能解决你的问题,请参考以下文章