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

但我不认为我的代码中存在错误:当 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 我没有收到警告。也许您使用的是旧版本?

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...