要从文件中读取行,需要使用getline()fgets() POSIX函数(忽略已可怕的gets())。通常,getline()fgets()优先,因为它根据需要分配行缓冲区。

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

最佳答案



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

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

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

    07-24 09:46
    查看更多