gpt4 book ai didi

c - 从文件读取时如何阻止堆栈缓冲区溢出?

转载 作者:太空宇宙 更新时间:2023-11-04 03:08:55 25 4
gpt4 key购买 nike

我正在读取 .txt 文件以将其保存到与文件本身大小相同的 char 数组中。这足以阻止不受控制的堆栈缓冲区溢出的发生吗?

我已经尝试过使用固定大小的缓冲区,但我现在明白这就是发生溢出的原因。

FILE *inputFP = NULL;

inputFP = fopen(input_file, "r");
if (inputFP == NULL)
return 1;
fseek(inputFP, 0, SEEK_END);
long fileSize = ftell(inputFP);
fseek(inputFP, 0, SEEK_SET);
char buffer[fileSize+20];

while ((ch = fgetc(inputFP)) != EOF)
{
buffer[i] = ch;
i++;
}

fprintf(outputFP, buffer, "%s");

一切正常,但我担心输入文件可能太大而导致出现问题。

最佳答案

I'm reading from a .txt file to save it to an char array at the same size as the file itself. Is this enough to stop a uncontrolled stack buffer overflow from happening?

您可以通过避免在数组外写入来防止缓冲区 溢出。它们是一件非常糟糕的事情TM

堆栈 当您耗尽线程/进程/程序中分配给堆栈的可用页面时,就会发生溢出。通常,堆栈的大小非常小(考虑大约 1 MiB)。这些也很糟糕,但它们只会让您的程序崩溃。

long fileSize = ftell(inputFP);
...
char buffer[fileSize+20];

这是一个可变长度数组 (VLA)。它分配动态(编译时未知)堆栈空间。如果你使用得当,你不会有缓冲区溢出,但你会有堆栈溢出,因为文件大小是无限的。


除了使用 VLA,您应该做的是使用固定大小的缓冲区并读取文件 block ,而不是整个文件。如果你真的需要将整个文件放在内存中,你可以尝试为其分配堆内存(malloc)或者内存映射它(mmap)。

关于c - 从文件读取时如何阻止堆栈缓冲区溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58564379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com