要从文件中读取行,有getline()
和fgets()
POSIX函数(忽略dread gets()
)。getline()
优先于常识是fgets()
因为它根据需要分配行缓冲区。
我的问题是:那不危险吗?如果某人出于偶然或出于恶意目的创建了一个100GB的文件而没有'\n'
字节怎么办–不会使我的getline()
呼叫分配大量的内存吗?
Joh*_*ger 16
我的问题是:那不危险吗?如果有人出于偶然或出于恶意目的创建了一个100GB的文件而没有'\ n'字节怎么办–会使我的getline()调用分配大量的内存吗?
是的,您所描述的是一个合理的风险。然而,
getline()
做的尝试本质上并不比编写自己的代码来进行冒险fgets()
;和setrlimit()
限制可保留的(虚拟)内存总量来减轻风险。这可能导致失败,而不是成功分配足够的内存来干扰系统的其余部分。我认为,最好的总体做法是首先编写不需要以全行为单位(一次全部)输入的代码,但是这种方法有其自身的复杂性。
是的,这很危险。不知道在其他计算机上如何工作,但是运行下面的代码会使我的计算机冻结到需要硬重置的地步:
/* 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)