fread导致堆溢出

时间:2016-10-26 17:13:10

标签: c overflow fread

使用以下c代码段

char charString[1024];

if (fread(charString, sizeof_data, 1, filePointer) != 1){ return false;}
else return true;

如果我提供 sizeof_data = 1024,filePointer指向的文件只有10bytes可以从文件中读取。我从程序中收到Abort信号。

如何优雅地处理它?<​​/ p>

1 个答案:

答案 0 :(得分:2)

你说的不是真的:sizeof_data是1024而缓冲区也是如此,所以没问题。所以问题在于你没有向我们展示的代码。两种可能性:

  1. sizeof_data大于缓冲区并覆盖堆栈(或其他数据);

  2. 您希望读取一个字符串,并且不要使用`\ 0&#39;来终止它。然后你打印它,导致f / s / printf导致段错误。

  3. 试试这段代码:

        char charString[1024];
        size_t n;
    
        if ((n=fread(charString, 1, (sizeof_data<1024?sizeof_data:1023), filePointer))==0)
            return false;
        CharString[n]='\0';          // terminate
        printf("%s\n",charString);   // safe to print now
        return true;
    

    请注意,我们要读取字符,因此项目大小为1,我们想要读取最多1023个,因此计数最多为1024个。