为什么 fclose 出现段错误?

发布于 2024-07-28 14:50:15 字数 507 浏览 3 评论 0原文

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

#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;
}

I'm clearly missing something. Could someone please explain why this would happen?

#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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

相思碎 2024-08-04 14:52:24

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

fread(&secret,... with secret being of type char* overwrite the value of scecret, and then probaly file, instead of writing into the value pointed by secret.

波浪屿的海角声 2024-08-04 14:51:56

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

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

您的意思是:

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

或者也许,secret 指向的缓冲区实际上并不是size 字节长。 你分配对了吗?

My guess is the problem is right here:

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

Did you mean:

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

Or maybe, the buffer pointed to by secret is not really size bytes long. Did you allocate it correctly?

往事随风而去 2024-08-04 14:51:31

您正在破坏堆栈,用读取“秘密”变量时出错的内容覆盖文件变量。 'secret' 已经是一个指针,所以它不需要 '&' 操作员。

fread 行应该读取

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

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

HTH。

You're smashing your stack, overwriting the file-variable with something borked when reading to the 'secret' variable. 'secret' is already a pointer, so it doesn't need the '&' operator.

The fread line should read

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

What you're doing is basically reading a new pointer value into secret (instead of the memory where secret is pointing to), and reading way too much, overflowing into your other variables. If you'd used secret within this function it'd have segfaulted as well (hopefully, or caused random damage in other parts of your program if you're unlucky).

HTH.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文