如何解决cppcheck“可能的空指针取消引用”误报还是错误?
我有这个 C 代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int value;
} pointer_t;
int some_func (pointer_t *p)
{
int v = ( rand () ) ? 99 :
( !p ) ? 0 :
( p->value % 2 == 0 ) ? 1 : /* << This is line 12 */
-1 ;
return v;
}
int main () {
pointer_t p = { .value = 7 };
printf ("With a pointer : %d\n",some_func (&p));
printf ("With a NULL : %d\n",some_func (NULL));
}
当我跑步时:
cppcheck prog.c
我收到以下警告:
[prog.c:12]: (warning) Possible null pointer dereference: p
但我不认为我的代码中存在错误:当 p
为 NULL
时,前一行已经检查了情况,因此在 12
p
行必须是非NULL
这是 cppcheck
中的误报,还是我没有检查过的极端情况?
编辑
如果有帮助,这些是我做过的一些检查:
/* Generates a warning */
v = ( rand () ) ? 99 :
( !p ) ? 0 :
( p->value % 2 == 0 ) ? 1 :
-1 ;
/* Does not generate a warning */
v = ( p == NULL ) ? 0 :
( p->value % 2 == 0 ) ? 1 :
-1 ;
/* Does not generate a warning */
if ( rand () )
v = 99;
else if (!p)
v = 0;
else if (p->value % 2 == 0)
v = 1;
else
v = -1;
/* Generates a warning */
v = ( rand () ) ? 99 :
( p == NULL ) ? 0 :
( p->value % 2 == 0 ) ? 1 :
-1 ;
解决方法
它看起来像是误报,因为 cppcheck
似乎没有遵循所有分支。
这基本上是:
if (rand())
return 99;
else if(!p)
return 0;
else if(p->value %2 == 0)
return 1;
else
return -1;
,
使用 Cppcheck 2.3
我没有收到警告。也许您使用的是旧版本?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。