cppcheck "Possible null pointer dereference"。误报还是错误?
cppcheck "Possible null pointer dereference". False positive or a bug?
我有这个 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
我没有收到该警告。也许您使用的是旧版本?
我有这个 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
我没有收到该警告。也许您使用的是旧版本?