cppcheck";可能的空指针取消引用;。假阳性还是错误?
我有一个C代码:cppcheck";可能的空指针取消引用;。假阳性还是错误?,c,null,warnings,dereference,cppcheck,C,Null,Warnings,Dereference,Cppcheck,我有一个C代码: #包括 #包括 类型定义结构{ int值; }指针; int some_func(指针_t*p) { int v=(rand())?99: (!p)?0: (p->值%2==0)?1:/*值%2==0)?1: -1 ; /*不会生成警告*/ v=(p==NULL)?0: (p->值%2==0)?1: -1 ; /*不会生成
#包括
#包括
类型定义结构{
int值;
}指针;
int some_func(指针_t*p)
{
int v=(rand())?99:
(!p)?0:
(p->值%2==0)?1:/*值%2==0)?1:
-1 ;
/*不会生成警告*/
v=(p==NULL)?0:
(p->值%2==0)?1:
-1 ;
/*不会生成警告*/
if(rand())
v=99;
如果(!p)
v=0;
否则如果(p->值%2==0)
v=1;
其他的
v=-1;
/*生成警告*/
v=(兰德())?99:
(p==NULL)?0:
(p->值%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
我没有收到警告。也许你使用的是旧版本?请编辑并删除每行上无用的/*x*/
注释。@Jabberwocky:它们不是无用的;它们使我能够识别第12行而不计算。@EricPostphil我或多或少同意。他应该放一个类似//的注释代码看起来有点模糊。例如,有效的typedef int pointer\u t
完全是误导性的。不过,您的警告看起来像是误报。@AndrewHenle它们对于代码高尔夫、创建额外的序列点以防止太好的优化、引入微妙的优先级错误或隐式类型升级非常有用。@AndrewHenle关于第二个和第三个操作数之间的错误。如果使用If-else,则可能会导致代码更快、更安全、更可读。但您的示例不会产生警告…@Hobber:他们的示例演示了原始代码的逻辑无法通过以更可读的形式显示等效代码来取消对空指针的引用。事实上,cppcheck不会端口a中的问题支持cppcheck中的错误问题。
if (rand())
return 99;
else if(!p)
return 0;
else if(p->value %2 == 0)
return 1;
else
return -1;