スタックオーバーフロー 【stack overflow】
概要
スタックオーバーフロー(stack overflow)とは、コンピュータプログラムの実行時エラーの一つで、関数などの呼び出し時にデータの一時的な保管に用いられるコールスタックが満杯になり、呼び出しに失敗すること。プログラムが実行される際、メインメモリから一定の容量が「コールスタック」(call stack)と呼ばれる制御用のデータ保管領域として確保される。関数などの呼び出しが行われると、呼び出し側の実行状態をスタックに一時保管し、呼び出しが終了すると保管された内容を取り出して呼び出し前の状態が復元される。
スタックには呼び出した関数などの終了時に戻るべきメモリ上の実行位置(リターンアドレス)や、呼び出し側が保持していたレジスタなどの情報が記録される。スタックへの保管は末尾へのデータの追加(プッシュ操作)により行われ、取り出し時は末尾にあるものから取り出される(ポップ操作)。
呼び出し先の関数などがさらに別の関数などを呼び出すと、スタックの末尾に追加で制御情報がプッシュされていく。スタックの容量には限りがあるため、何重にも次々に関数を呼び出していくと容量を使い果たしてそれ以上データを追加できなくなる。スタックが満杯の状態で呼び出しが行われるとスタックオーバーフローとなりプログラムは異常終了する。
スタックオーバーフローが起きやすいのは関数が自分自身を呼び出す「再帰呼び出し」で、終了条件の判定に失敗して無限に自身を呼び出し続けるような処理の流れになってしまった場合によく起きる。単に複雑な処理で何段階も関数呼び出しが重なった場合でも、実行時に確保したスタックの容量が想定外に少ない場合にはスタックオーバーフローとなることがある。
(2024.2.8更新)