Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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
C 静态分析奇怪的结果_C_Clang - Fatal编程技术网

C 静态分析奇怪的结果

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"))

我正在研究幻数的使用,我将我的实验简化为以下程序。我注意到,当我在Xcode中使用静态分析函数时,对于
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,则忽略该行的其余部分,否则在分析下一行时可能会出现未初始化的值。