fread 导致堆溢出
fread leads to heap overflow
使用下面的 C 代码片段
char charString[1024];
if (fread(charString, sizeof_data, 1, filePointer) != 1){ return false;}
else return true;
如果我提供
sizeof_data = 1024 并且 filePointer 指向的文件只有 10 个字节可以从文件中读取。我收到来自程序的中止信号。
如何优雅地处理?
你说的不可能是真的:sizeof_data
是 1024,缓冲区也是,所以没问题。所以问题出在您没有向我们展示的代码中。两种可能性:
sizeof_data
比缓冲区大,你覆盖堆栈(或其他数据);
你希望读取一个字符串并且不要以'\0'结束它然后打印它,导致f/s/printf导致段错误。
试试这个代码:
char charString[1024];
size_t n;
if ((n=fread(charString, 1, (sizeof_data<1024?sizeof_data:1023), filePointer))==0)
return false;
CharString[n]='[=10=]'; // terminate
printf("%s\n",charString); // safe to print now
return true;
请注意,我们要读取字符,因此项目大小为 1,我们最多要读取其中的 1023 个,因此计数最大为 1024。
使用下面的 C 代码片段
char charString[1024];
if (fread(charString, sizeof_data, 1, filePointer) != 1){ return false;}
else return true;
如果我提供 sizeof_data = 1024 并且 filePointer 指向的文件只有 10 个字节可以从文件中读取。我收到来自程序的中止信号。
如何优雅地处理?
你说的不可能是真的:sizeof_data
是 1024,缓冲区也是,所以没问题。所以问题出在您没有向我们展示的代码中。两种可能性:
sizeof_data
比缓冲区大,你覆盖堆栈(或其他数据);你希望读取一个字符串并且不要以'\0'结束它然后打印它,导致f/s/printf导致段错误。
试试这个代码:
char charString[1024];
size_t n;
if ((n=fread(charString, 1, (sizeof_data<1024?sizeof_data:1023), filePointer))==0)
return false;
CharString[n]='[=10=]'; // terminate
printf("%s\n",charString); // safe to print now
return true;
请注意,我们要读取字符,因此项目大小为 1,我们最多要读取其中的 1023 个,因此计数最大为 1024。