Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用带有unsigned int的calloc时,coverity为什么会抱怨_C_Calloc_Coverity - Fatal编程技术网

使用带有unsigned int的calloc时,coverity为什么会抱怨

使用带有unsigned int的calloc时,coverity为什么会抱怨,c,calloc,coverity,C,Calloc,Coverity,我有以下资料: static unsigned int *tick = NULL; ... if (tick == NULL) tick = calloc(MAX_PORT,sizeof(unsigned int)); ... 功能正常,但coverity抱怨: 分析警告PW.不兼容的\u赋值\u操作数 1.不兼容的\u赋值\u操作数:不能将int类型的值赋值给unsigned int*类型的实体 我不完全理解为什么错误消息表明Coverity认为calloc返回int, 如果在旧

我有以下资料:

static unsigned int *tick = NULL;
...
 if (tick == NULL)
     tick = calloc(MAX_PORT,sizeof(unsigned int));
...
功能正常,但coverity抱怨: 分析警告PW.不兼容的\u赋值\u操作数 1.不兼容的\u赋值\u操作数:不能将int类型的值赋值给unsigned int*类型的实体
我不完全理解为什么错误消息表明Coverity认为calloc返回int, 如果在旧的C语言中没有包含calloc的stdlib.h,就会发生这种情况。 但这在现代C语言中是不允许的,即C99及以上版本中不允许隐式声明

。。。其功能与预期一样

不,这段代码不能在任何新的或旧的C版本上编译

在旧版本的C90中,您可能会忘记包含stdlib.h,然后编译器会将calloc视为返回int的函数,而不是void*。这就是静态分析仪的工作原理。但是代码甚至不应该编译,因为即使在C90编译器上,它也会导致诊断-您不能将int赋值给未签名的int*。它从来都不是有效的C

在标准C中,代码甚至不会走那么远,因为编译器会告诉您它不知道标识符calloc是什么


所有这些都表明您的编译器有1个旧版本和2个不兼容版本

什么是最大端口?什么是最大端口?包含在哪里?猜猜看:你忘了包含?它抱怨的不是未签名的int,而是要勾选的赋值。@Someprogrammerdude正确,我现在添加了它。你为什么一开始就用C90编程?不允许最好写为不一致。我使用的每个C编译器都允许调用未声明的函数,使用K&R C提出的语义C90。这样的代码确实不符合C99或C2011标准,但不要求拒绝。我现在包括stdlib.h,看看它是否消失。谢谢然而,真正的问题是,如何在没有任何形式的编译器消息的情况下编译它。从int到unsigned int*的赋值无效。从未有效过。我猜您使用的是较旧版本的gcc编译器,默认为crap模式,也称为gnu90。在gnu90中,它们允许违反C标准约束,因为:废话。我使用的是来自WindRiver的diab,而不是GCC。@cerr好的,您可能想向它们报告一个bug和/或获得一个更好的编译器。gcc-std=c11-pedanticerrors给出错误:函数“calloc”的隐式声明。恐龙模式下的gcc-std=c90-迂腐错误或垃圾模式下的gcc-迂腐错误都是一样的,但这次只是一个警告,不是错误。gcc恐龙和垃圾都未能对约束冲突进行诊断。我只有在激发它时才明白:tick=intcalloc…@cerr:如果diab编译器没有抱怨,那么你需要一个更好的编译器。如果它抱怨,但你没有纠正它的抱怨,那么你是错的;编译器不会生成让人恼火的警告——它们之所以生成警告,是因为它们确信您所写的不是真的。在你职业生涯的这个阶段,以及在接下来的三十多年里,接受编译器比你更了解C的事实。现在,还不清楚是否可以用diab编译GCC;它需要一个相当胜任的现代C++编译器来引导GCC的编译。