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,缓冲区也是,所以没问题。所以问题出在您没有向我们展示的代码中。两种可能性:

  1. sizeof_data 比缓冲区大,你覆盖堆栈(或其他数据);

  2. 你希望读取一个字符串并且不要以'\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。