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

バッファは単なる配列と考えてください。配列の末尾を超えてインデックスを参照しようとするときはいつでも、「オーバーフロー」と「オーバーラン」を同じ意味で使用することがよくありますが、それは問題ありません。個人的に、私は違います:

バッファ オーバーフロー 配列が保持できるよりも多くの項目を配列に入れようとした場合です。それらはバッファの最後から流れ出します。言い換えれば、執筆に由来します .

バッファ オーバーラン バッファを反復処理していて、配列の末尾を超えて読み続けている場合です。イテレータはバッファを介して実行され、続行されます。言い換えれば、それは読書から来ています .

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


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

void k()
{
    BYTE buf[5];
    for( int i = 0; i < 10; ++i )
        buf[i] = 0xcd;
}

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

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