为啥在 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 上出现段错误?的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 libc 上使用 ctypes 调用 environ 时,为啥 Python 会出现段错误?
为啥这个基本链表可以在 MacOS 上工作,但在 Linux 上会出现段错误