6


11

バッファオーバーフロー(vs)バッファオーバーラン(vs)スタックオーバーフロー

_ 可能な重複: + https://stackoverflow.com/questions/1120575/what-is-the-difference-between-a-stack-overflow-and-buffer-overflow [スタックオーバーフローとバッファの違いは何ですかオーバーフロー?] _

バッファオーバーフローとバッファオーバーランの違いは何ですか?

バッファオーバーランとスタックオーバーフローの違いは何ですか?

コード例を含めてください。 私はウィキペディアの用語を調べましたが、C、C、またはJavaでのプログラミングと一致させることはできません。

4 Answer


25


バッファを単なる配列と考えてください。 バッファオーバーフロー*は、配列が保持できるよりも多くの項目を配列に入れようとしたときです。 言い換えれば、それは writing *から来ています。

バッファオーバーラン*は、バッファを反復処理して配列の終わりを超えて読み続ける場合です。 つまり、それは reading *に由来します。

スタックオーバーフローは大きく異なります。 最近のほとんどのプログラミング環境はスタックベースであり、プログラムフローを制御するためにスタックデータ構造を使用します。 関数を呼び出すたびに、新しい項目がプログラムの呼び出しスタックに配置されます。 関数が戻ると、アイテムはスタックからポップされます。 スタックが空になると、プログラムは停止します。 問題は、このスタックのサイズは限られていることです。一度にたくさんの関数を呼び出して、スタックをいっぱいにすることは可能です。 この時点で、スタックオーバーフローが発生しています。 これを行う最も一般的な方法は、関数が自分自身を呼び出すとき(再帰)です。


16


バッファオーバーフロー/バッファオーバーラン:

void k(){BYTE buf [5]; (int i = 0; i <10; i)についてbuf [i] = 0xcd; }

スタックオーバーフロー :

void f(){int k = 0; f(); }


1


C / Cでは、バッファオーバーフローとバッファオーバーランに違いがあります。

  • 元のバッファサイズを超えてインデックス/ポイントした場合のオーバーフローを定義できます(例:3要素配列の6番目の要素を読む)

  • あなたが互いに隣接する複数のバッファを持っていて、2番目のインデックスを作成するときにオーバーランを定義することができます(例えば、最初の3要素配列の6番目の要素を読みますが、2番目の3要素配列の3番目の要素を得ます)。

スタックオーバーフローは、スタック全体の「メモリバッファ」をいっぱいにしたときのバッファオーバーフローです。


0


_ バッファオーバーフローとバッファオーバーランの違いは何ですか? バッファオーバーフローはバッファの終わりを超えて書き込もうとしたときに発生すると思いますが、それを防ぐチェックがあります。 バッファオーバーランは、実際にバッファの末尾を超えて書き込むときです。 1つ目は高速で失敗し、2つ目は検出が困難です。 _

バッファは常に境界チェックを行い、したがってBufferOverflowExceptionを生成するため、javaではバッファをオーバーランさせることはできません。

_ バッファオーバーランとスタックオーバーフローの違いは何ですか? _

彼らは互いに関係がありません。