1. ホーム
  2. c++

[解決済み] スタックとヒープがぶつかるとどうなるか

2022-02-14 06:29:32

質問

スタックとヒープがぶつかるとどうなるのか気になります。どなたか遭遇したことのある方がいらっしゃいましたら、そのシナリオを説明してください。

解決方法は?

モダンなOS上で動作するモダンな言語では、スタックオーバーフロー(万歳!)または malloc() または sbrk() または mmap() は、ヒープを大きくしようとすると失敗します。 しかし、すべてのソフトウェアがモダンなわけではありませんから、失敗のモードを見てみましょう。

  • スタックがヒープに成長した場合、一般的なCコンパイラはヒープのデータ構造を黙って上書きし始めます。 最近のOSでは、1つまたは複数の仮想メモリー ガードページ スタックが無制限に増えるのを防ぐものです。 ガードページのメモリ量が、少なくとも成長しているプロシージャのアクティベーションレコードのサイズと同じである限り、OSはセグメンテーションフォールトを保証してくれます。 MMUのないマシンでDOSを動かしている場合は、おそらくお手上げでしょう。

  • ヒープがスタックに成長した場合、オペレーティングシステムは常に状況を認識し、何らかのシステムコールが失敗するはずです。 の実装は malloc() ほぼ間違いなくこの失敗に気づき NULL . その後どうするかは、あなた次第です。

私はいつも、OSがスタックのオーバーフローを防ぐためにガードページを設置することを望むコンパイラーたちの意欲に驚かされます。 もちろん、このトリックは、それぞれが独自のスタックを持つ何千ものスレッドを持ち始めるまではうまくいくのですが...。