C 静态分析奇怪的结果
我正在研究幻数的使用,我将我的实验简化为以下程序。我注意到,当我在Xcode中使用静态分析函数时,对于C 静态分析奇怪的结果,c,clang,C,Clang,我正在研究幻数的使用,我将我的实验简化为以下程序。我注意到,当我在Xcode中使用静态分析函数时,对于temp[4]比较,我得到消息“左操作数的'=='是一个垃圾值”。这是假阳性吗?如果是,为什么 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *input; if(!(input = fopen("unknown_video.ext", "rb"))
temp[4]
比较,我得到消息“左操作数的'=='是一个垃圾值”。这是假阳性吗?如果是,为什么
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *input;
if(!(input = fopen("unknown_video.ext", "rb")))
return(EXIT_FAILURE);
int test_size = 10;
int b = 0;
int temp[test_size];
while(b < test_size)
{
if((temp[b] = fgetc(input)) == EOF)
break;
b++;
}
fclose(input);
if((temp[0] == 'R') && (temp[1] == 'I') && (temp[2] == 'F') && (temp[3] == 'F'))
{
printf("RIFF\n");
}
else if((temp[4] == 'f') && (temp[5] == 't') && (temp[6] == 'y') && (temp[7] == 'p'))
{
printf("QuickTime\n");
}
return(EXIT_SUCCESS);
}
#包括
#包括
int main(int argc,char*argv[])
{
文件*输入;
如果(!(输入=fopen(“未知的”\u video.ext,“rb”))
返回(退出失败);
int test_size=10;
int b=0;
内部温度[测试尺寸];
而(b<试验尺寸)
{
如果((温度[b]=fgetc(输入))==EOF)
打破
b++;
}
fclose(输入);
如果((温度[0]='R')&&(温度[1]='I')&&(温度[2]='F')&&(温度[3]='F'))
{
printf(“RIFF\n”);
}
否则如果((温度[4]='f')&&(温度[5]='t')&&(温度[6]='y')&&(温度[7]='p'))
{
printf(“QuickTime\n”);
}
返回(退出成功);
}
临时数组中的所有值都可能被单位化
看那些台词
while(b < test_size)
{
if((temp[b] = fgetc(input)) == EOF)
break;
b++;
}
while(b
我们有可能fgetc
立即返回EOF
,从而使以下所有测试针对未初始化的值进行测试
解决此问题的最简单方法是初始化临时数组。临时数组中的所有值都可能被单位化 看那些台词
while(b < test_size)
{
if((temp[b] = fgetc(input)) == EOF)
break;
b++;
}
while(b
我们有可能fgetc
立即返回EOF
,从而使以下所有测试针对未初始化的值进行测试
解决此问题的最简单方法是初始化临时数组。int-temp[test_size]={0}//将整个数组初始化为0@SteveCox可变大小的对象不能以这种方式初始化(无论如何,根据叮当声),是的,它们不能。在某些编译器中,可变大小数组不能以这种方式声明(或者它们至少会发出警告)。我还以为clang就是其中之一。如果它的长度是可变的,那么您应该明确地执行int*temp=calloc(test_size,sizeof*temp);int temp[test_size]={0}//将整个数组初始化为0@SteveCox可变大小的对象不能以这种方式初始化(无论如何,根据叮当声),是的,它们不能。在某些编译器中,可变大小数组不能以这种方式声明(或者它们至少会发出警告)。我还以为clang就是其中之一。如果它的长度是可变的,那么您应该明确地执行int*temp=calloc(test_size,sizeof*temp);谢谢你,这消除了警告。我的假设是该文件的大小至少为10字节,但我猜不是分析器的。奇怪的是为什么它没有在
temp[1]==…
处标记。@koan它没有标记第一行中的任何一行,因为该行上的任何比较都不会经过EOF——任何索引0-3处的EOF都会导致整条语句失败,如果,则落在处。此外,如果单击诊断,Xcode应该以与clang的扫描视图脚本中类似的方式显示其逻辑流:@tab Yes,但该逻辑流没有解释为什么它之前没有标记。但正如您所解释的,如果[0]是一个EOF,那么该行的其余部分将被忽略,否则在分析下一行时可能会有未初始化的值。谢谢,这消除了警告。我的假设是该文件的大小至少为10字节,但我猜不是分析器的。奇怪的是为什么它没有在temp[1]==…
处标记。@koan它没有标记第一行中的任何一行,因为该行上的任何比较都不会经过EOF——任何索引0-3处的EOF都会导致整条语句失败,如果,则落在处。此外,如果单击诊断,Xcode应该以与clang的扫描视图脚本中类似的方式显示其逻辑流:@tab Yes,但该逻辑流没有解释为什么它之前没有标记。但正如您所解释的,如果[0]是EOF,则忽略该行的其余部分,否则在分析下一行时可能会出现未初始化的值。