【问题标题】:Why segfault on fclose?为什么在 fclose 上出现段错误?
【发布时间】:2009-07-28 09:35:49
【问题描述】:

我显然错过了一些东西。有人能解释一下为什么会发生这种情况吗?

#define RANDOM_DEVICE "/dev/random"
int create_shared_secret(char * secret,int size)
{
  FILE * file=NULL;
  int RetVal;

  file=fopen(RANDOM_DEVICE,"r");
  if(!file)
  {
    printf("Unable to open random device %s\n",RANDOM_DEVICE);
    exit(-1);
  }
  RetVal=fread(&secret,1,size,file);
  if(RetVal!=size)
  {
    printf("Problem getting seed value\n");
    exit(-1);
  }

  if(file) fclose(file);  //segfault right here
  return 0;
}

【问题讨论】:

    标签: c file segmentation-fault


    【解决方案1】:

    你正在破坏你的堆栈,在读取“秘密”变量时用一些无聊的东西覆盖文件变量。 'secret' 已经是一个指针,所以它不需要'&' 运算符。

    fread 行应该是

    RetVal=fread(secret,1,size,file);
    

    您所做的基本上是将一个新的指针值读入秘密(而不是秘密指向的内存),并且读取太多,溢出到您的其他变量中。如果你在这个函数中使用了 secret,它也会出现段错误(希望如此,或者如果你不走运的话,会在程序的其他部分造成随机损坏)。

    HTH。

    【讨论】:

    • +1 获得正确答案和良好解释的最佳组合。
    • @caf: fread 接受 void *。没有需要警告的转化。
    【解决方案2】:

    我的猜测是问题就在这里:

    RetVal=fread(&secret,1,size,file);
    

    你的意思是:

    RetVal=fread(secret,1,size,file);
    

    或者,secret 指向的缓冲区并不是真正的size 字节长。你分配对了吗?

    【讨论】:

      【解决方案3】:

      fread(&secret,... 类型为char* 的秘密覆盖秘密的值,然后可能是文件,而不是写入秘密指向的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-23
        • 2013-01-29
        • 2013-02-11
        相关资源
        最近更新 更多