为啥在 fclose 上出现段错误?

Posted

技术标签:

【中文标题】为啥在 fclose 上出现段错误?【英文标题】: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;

【问题讨论】:

【参考方案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* 的秘密覆盖秘密的值,然后可能是文件,而不是写入秘密指向的值。

【讨论】:

以上是关于为啥在 fclose 上出现段错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的代码在 Windows 7 上不会出现段错误?

尝试在 libc 上使用 ctypes 调用 environ 时,为啥 Python 会出现段错误?

段错误 - fclose / fopen

为啥这个基本链表可以在 MacOS 上工作,但在 Linux 上会出现段错误

为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?

为啥在将 malloc() 的指针分配给 char* 时会出现段错误?