リンカ・ローダと実行形式
再帰が深くなりすぎてスタックの上限を超えたとき、Linuxなどで一般に起こることとして正しいものはどれか。
- Aスタックの先にある、アクセスを禁止したガードページに触れて、プログラムが異常終了する
- BOSが自動でスタックをディスクに移し、いくらでも深く再帰できる
- C古いスタックフレームが自動で消され、計算は正しく続く
答えと解説を見る
正解:A. スタックの先にある、アクセスを禁止したガードページに触れて、プログラムが異常終了する
スタックには上限があり、その先にはアクセスを禁止したガードページが置かれます。再帰が深すぎてスタックがここに達すると、ページフォルトが起きてOSがプログラムを止めます(セグメンテーション違反)。ほかのデータを壊す前に止められるのがガードページの利点です。大きな配列を局所変数にしても同じことが起きるので、大きなデータはヒープに置くのが安全です。
- A. 正しい。スタックオーバーフローとして検出されます。
- B. 上限を超えて伸ばすことはしません。
- C. フレームを勝手に消すと戻れなくなります。