web-dev-qa-db-ja.com

C:バッファアンダーフローの例は何ですか?

バッファオーバーフローとは何かを知っています。しかし、バッファアンダーフローが何であるかはわかりません。

特定のバッファがバイトのオーバーフローではなく、アンダーフローを受け取るときだと思います。

char buffer[8];
fgets(buffer, sizeof(buffer), stdin);

上記はエラーになりません。

char buffer_overflow[8];
fgets(buffer_overflow, 16, stdin);

上記の場合、ユーザー入力がたとえば「deutschland」の場合、バッファオーバーフローになります。

コードで例を取得できますか?バッファアンダーフローとは何ですか?

17
Karl Morrison

バッファアンダーフローは、バッファオーバーフローとは直接関係ありません。ただし、バッファアンダーフローは、たとえば、リングバッファ。

たとえば、オーディオ再生について考えてみます。オーディオバッファは、おそらくカーネルメモリのどこかにあるリングバッファです。オーディオドライバ/ハードウェアがバッファから読み取るよりも遅いデータを書き込むと、バッファが空になり(「アンダーフロー」)、オーディオが途切れる原因になります。他の種類のリアルタイムデータ処理やメディア再生にも同様の問題があります。

したがって、バッファアンダーフロー自体は障害状態ではないことがよくあります(通常、プログラムが終了や不要なコードの実行などの未定義の不要な動作を実行するバッファオーバーフローとは異なります)。

20
dom0

私は時々、バッファの先頭の前で誤って読むことを指す用語が使われることを耳にしました。この言葉の使い方が「正しい」かどうかはわかりません。

例として、この欠陥のあるスタックの実装を考えてみましょう。

_struct fixed_size_stack
{
  int top;
  int data[128];
};

int
fixed_size_stack_pop(struct fixed_size_stack * this)
{
  return this->data[--(this->top)];
}
_

if (this->top > 0)の欠落したチェックにより、すでに空のスタックからのポップが要求された場合、関数は配列の下限を上書きします。

5
5gon12eder

PVS V512 にいくつかの例があります。私は gearmad 実装で問題をスニペットで取得しました:

  pollfd fds[2];
  ...
  memset(fds, 0, sizeof(pollfd));
0
palik