リンカ・ローダと実行形式

再帰が深くなりすぎてスタックの上限を超えたとき、Linuxなどで一般に起こることとして正しいものはどれか。

  1. Aスタックの先にある、アクセスを禁止したガードページに触れて、プログラムが異常終了する
  2. BOSが自動でスタックをディスクに移し、いくらでも深く再帰できる
  3. C古いスタックフレームが自動で消され、計算は正しく続く
答えと解説を見る

正解:A. スタックの先にある、アクセスを禁止したガードページに触れて、プログラムが異常終了する

スタックには上限があり、その先にはアクセスを禁止したガードページが置かれます。再帰が深すぎてスタックがここに達すると、ページフォルトが起きてOSがプログラムを止めます(セグメンテーション違反)。ほかのデータを壊す前に止められるのがガードページの利点です。大きな配列を局所変数にしても同じことが起きるので、大きなデータはヒープに置くのが安全です。

  • A. 正しい。スタックオーバーフローとして検出されます。
  • B. 上限を超えて伸ばすことはしません。
  • C. フレームを勝手に消すと戻れなくなります。
この分野を解く 分野ページへ

リンカ・ローダと実行形式のほかの問題

  1. C言語で、初期値を書かない局所変数とグローバル変数の、使い始めたときの値について正しいものはどれか。
  2. mallocとfreeを繰り返すうちに、空きメモリの合計は十分あるのに、大きな領域をまとめて確保できなくなることがある。この現象を何と呼ぶか。
  3. 共有ライブラリを作るとき、外から使う関数だけを公開し、内部の関数はシンボルの可視性(visibility)を「hidden」にする利点として正しいものはどれか。
  4. C++でグローバルなオブジェクトのコンストラクタがmainより前に実行されるしくみとして正しいものはどれか。
  5. コンパイラが1つのソースファイルから出力するオブジェクトファイル(.o)について正しいものはどれか。