【问题标题】:Assigning memory size dynamically causes stack smashing error [duplicate]动态分配内存大小会导致堆栈粉碎错误[重复]
【发布时间】:2018-12-13 10:53:44
【问题描述】:

情况很简单,但我不知道为什么会溢出缓冲区。我正在尝试打印文件的内容。将static int 分配给count 是可行的,但是任何找出文件大小的方法都会导致出现此错误并退出程序。

来源:

char path[] = "upload/";
strcat(path, filename);

FILE *file;

file = fopen(path, "r");
fseek(file, 0, SEEK_END);
int count = ftell(file);
printf("%d\n",count);
char *buffer = malloc(count);

fseek(file, 0, SEEK_SET);


fread(buffer, count, 1, file);
printf("%s\n", buffer);
free(buffer);
fclose(file);

任何帮助将不胜感激!

【问题讨论】:

  • ftell 返回一个长整数
  • 你不能 strcat 到这样的数组。
  • 您忘记为终止 NUL 字符分配一个额外的字节
  • 此外,您没有检查这些函数中的 any 的返回值。你必须检查fopenmallocfseekfread等的返回值并采取行动。如果你不这样做,你将永远 有什么线索。

标签: c file strcat


【解决方案1】:

在您的代码中

char path[] = "upload/";
strcat(path, filename);

数组path 只为upload/ 和空终止符分配了空间(即调整大小)。将其用作strcat() 的目标会越界访问内存,这会导致undefined behavior

来自man page强调我的

strcat() 函数将src 字符串附加到dest 字符串,覆盖dest 末尾的终止空字节('\0'),然后添加终止空字节。字符串不能重叠,dest 字符串必须有足够的空间用于结果。如果dest不够大,程序行为是不可预测的;

也就是说,

  • ftell() 返回一个long,您应该相应地更改count 的类型。
  • 在使用返回值之前,您应该始终检查函数调用的返回值是否成功。

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多