getline()与fgets():控制内存分配

eda*_*vid 21 c posix

要从文件中读取行,有getline()fgets()POSIX函数(忽略dread gets())。getline()优先于常识是fgets()因为它根据需要分配行缓冲区。

我的问题是:那不危险吗?如果某人出于偶然或出于恶意目的创建了一个100GB的文件而没有'\n'字节怎么办–不会使我的getline()呼叫分配大量的内存吗?

Joh*_*ger 16

我的问题是:那不危险吗?如果有人出于偶然或出于恶意目的创建了一个100GB的文件而没有'\ n'字节怎么办–会使我的getline()调用分配大量的内存吗?

是的,您所描述的是一个合理的风险。然而,

  • 如果程序需要立即将整个行加载到内存中,那么允许这样getline()做的尝试本质上并不比编写自己的代码来进行冒险fgets();和
  • 如果您的程序具有这样的漏洞,则可以通过setrlimit()限制可保留的(虚拟)内存总量来减轻风险。这可能导致失败,而不是成功分配足够的内存来干扰系统的其余部分。

我认为,最好的总体做法是首先编写不需要以全行为单位(一次全部)输入的代码,但是这种方法有其自身的复杂性。


Tom*_*ych 9

是的,这很危险。不知道在其他计算机上如何工作,但是运行下面的代码会使我的计算机冻结到需要硬重置的地步:

/* DANGEROUS CODE */

#include <stdio.h>

int main(void)
{
    FILE *f;
    char *s;
    size_t n = 0;

    f = fopen("/dev/zero", "r");
    getline(&s, &n, f);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)