1

したがって、メモリが衝突したときのスタック オーバーフロー (およびこの Web サイトのタイトル) は理解できますが、スタックへの新しいエントリが減少するメモリ アドレスにある理由がわかりません。それらがランダムなメモリアドレスにないのはなぜですか?メモリの衝突が問題にならないようにする方が理にかなっているでしょうか? その背後には、ある種の最適化の理由があると思いますか?

** 編集 **

私が気付いていなかったのは、スタックには x 量のアドレス空間が与えられているということです。今では理にかなっていますが、フォローアップの質問に至ります。スタックに割り当てるメモリの量を明示的に指定できますか?

4

3 に答える 3

3

「メモリの衝突」は、「バッファオーバーフロー」という用語に適しています。ここでは、事前に割り当てられたスペースの外に書き込みますが、別の割り当てられたメモリブロック内にある可能性があります。

スタック オーバーフローは、自分のメモリ割り当ての外側で別のメモリ割り当てに書き込むことではありません。スタックメモリ割り当ての外側に書き込むだけです。ほとんどの場合、スタックの外側に、何にも割り当てられておらず、読み取りまたは書き込みの試行でエラーを引き起こすガード メモリ ページがあります。

また、スタックにプッシュされた各値にランダムなアドレスを割り当てると、スタック上のデータを見つけるのが難しくなります (それはもはやスタックではありません)。コンパイラまたはプログラマは、後続の要素が後続のアドレスを占有していることを認識している場合、スタック フレームのベース ポインターからそれらのアドレスを簡単に計算できます。

于 2013-05-30T14:06:48.687 に答える
1

この質問への答えはおそらく複雑ですが、基本的にスタック操作は、プロセッサがコードの通常の実行の一部として行う非常に原始的な機能と見なされます。(返信先住所などを保存します。)

では、メモリ管理コードはどこに置くのでしょうか? 割り当てられたアドレスをどこで追跡したり、新しいアドレスを割り当てるコードを追加したりしますか? これらはプロセッサ自体によって実行される基本的な操作であるため、これを行う場所は実際にはありません。

コード自体を保持するメモリと同様に、スタックはコードが実行される前にセットアップされている (およびスタック レジスタによってポイントされている) と見なされます。スタック メモリに複雑なメモリ管理を追加する場所は実際にはありません。そのため、十分なメモリが提供されていない場合、スタックはオーバーフローします。

于 2013-05-30T14:05:39.300 に答える
1

スタック オーバーフローは、利用可能なすべてのスタック スペースを使い果たしたときです。スタックに使用できるスペースは、ほとんどの場合、システム設計者が選択した任意の制限にすぎません。これを変更することは可能ですが、最新のシステムでは実際には問題になりません。数メガバイトのスタックを必要とするコードは、システムが非常に巨大でない限り、おそらく正しく設計されていません。

スタックは「カスタム」からゼロに向かって成長します。定義された方向に進む必要があります。そうしないと、何が起こっているのかを追跡するのが非常に難しくなり、下位アドレスは上位アドレスと同じくらい良いものになります。以前は、スタックとヒープが相互に成長していました。これにより、大量のスタックを使用し、それほど多くのヒープを使用しないコードが、少量のスタックと大量のヒープを使用するものと同じ量のメモリで動作できるようになります。ヒープ。しかし、最近では通常、ヒープをスタックから完全に分離した場所に定義できる十分なメモリ (スペース) があります。代わりに、使用できないスタックの一番上にある「予約済み」メモリの領域を使用することで、スタック オーバーフローが検出されます。そのため、OS は使用できないメモリを使用するための「トラップ」を取得し、アプリケーションを強制終了することができます。 .

于 2013-05-30T14:10:33.160 に答える