在我的C应用程序中,我尝试从用户那里获取一个字符(不需要对其进行消毒)以获取命令。函数,如getchar()、fgetc(stdin)和scanf(.)当与coverity一起使用时,所有这些都会给出以下错误:Event dereference: Dereferencing "_stdin()", which is known to be "NULL"。我使用攻击级别设置为中度,用于coverity命令。
例如,在使用cAck变量之前,我尝试过检查cAck与NULL、stdin与NULL、ferror(stdin)、feof(stdin)和feof(Stdin)(编辑:我在没有任何这些检查的情况下尝试过,coverity仍在抱怨)。在没有coverity投诉的情况下,我怎样才能像下面这样运行呢?
char cAck;
if( (cAck = fgetc(stdin)) != NULL)
{
// do something with cAck
}发布于 2022-09-15 22:53:27
因为(显然,对于您的编译器) fgetc是一个退出stdin的宏。
正如斯科特所指出的,这基本上是我遇到的问题。我只试着检查stdin==NULL,然后返回,希望它能看到stdin对于其余的代码来说不是空的,但是coverity抱怨说有和没有检查。顺便提一下,如果我检查stdin为空并继续使用它,我相信coverity还会将其标记为FORWARD_NULL错误。
与EOF核对并没有解决这个问题。幸运的是,使用scanf("%c“&cAck)函数删除了coverity取消引用错误,这是主要问题。我还检查了返回值和char输入的界限,后者是针对coverity污染变量问题的。
发布于 2022-09-15 21:46:46
信息:
事件取消引用:删除"_stdin()",它已知为"NULL“
这意味着,在代码中的某个地方,您使用NULL测试了NULL,例如:
if (stdin == NULL) {
printf("stdin was NULL!\n");
// but I kept going anyway, rather than aborting
}事实上,你说过:
我试过检查..。stdin对空
Coverity看到了这个测试,假设程序员正在检查一个可能为真的条件,因此得出结论认为,stdin实际上是NULL。因为(显然,对于编译器来说) fgetc是一个取消引用stdin的宏,所以Coverity得出结论,取消引用可能会失败,从而导致未定义的行为(通常是崩溃)。
虽然stdin有类型FILE*,这是指针类型,但在启动时它从来不是NULL,并且试图将其设置为NULL本身就是未定义的行为(参见偏好: stdin),因此通常可以假定stdin永远不是NULL。因此,您不应该通过检查工具或其他程序员是否是NULL来混淆它。
也就是说,删除stdin==NULL的检查,然后Coverity应该停止抱怨。
另外,正如注释中所指出的,fgetc的返回值是int,因此将其返回值与指针NULL (至少是一次近似)进行比较是毫无意义的。相反,您可能希望将其与常量EOF进行比较。
char cAck;
if( (cAck = fgetc(stdin)) != EOF)
// ^^^ changed
{
// do something with cAck
}https://stackoverflow.com/questions/73736062
复制相似问题