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

但我认为我的代码中没有错误:前一行已经检查了 pNULL 的情况,因此在行 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 我没有收到该警告。也许您使用的是旧版本?