1. ホーム
  2. c

[解決済み] getline() と fgets() の比較。メモリの割り当てを制御する

2022-03-07 05:57:10

質問

ファイルから行を読み込むには、次のような方法があります。 getline()fgets() POSIX 関数 (恐ろしい gets() ). というのは常識です。 getline() よりも優先されます。 fgets() は、必要に応じてラインバッファを割り当てるからです。

質問ですが、それは危険ではないですか?もし誰かが事故や悪意で100GBのファイルを作成し '\n' バイトになるのでは? getline() の呼び出しは、非常識な量のメモリを割り当てるのですか?

解決方法は?

<ブロッククオート

質問ですが、それは危険ではないですか?もし、事故や悪意があった場合 を1バイトも含まない100GBのファイルを作成する人がいるのですが、そのようなことはありませんか? そのため、getline()コールが非常識な量のメモリを割り当てることになるのでは?

はい、あなたが説明したことは、もっともなリスクです。 しかし

  • 一度に1行全体をメモリに読み込む必要があるプログラムでは、このような場合 getline() を使ってそれを行うコードを書くよりも、それを試みる方が本質的にリスクが高いとは言えません。 fgets() とします。
  • そのような脆弱性を持つプログラムがある場合、そのリスクを軽減するために setrlimit() を使用して、確保できる (仮想) メモリの総量を制限します。 これは、システムの他の部分に干渉するのに十分なメモリをうまく割り当てる代わりに、失敗させるために使用することができます。

全体としてベストなのは、そもそも全行単位の入力を必要としないコードを書くことだと思いますが、そのようなアプローチにはそれなりの複雑さがあります。