0

私はこれを見たことがありませんが、私はこれを頭の中に持っていました!

ここでのスタックメモリエラーは、メモリの破損でもある可能性があります。ac /c​​++プログラムにスタックオーバーフローがあるとしましょう。

コアダンプファイルを作成しますか?

4

2 に答える 2

1

スタックオーバーフローは、コアダンプファイルを常に作成するとは限りません。運が良ければ、それはスタックの単純なオーバーランであり、いくつかのローカル変数またはバッファーが上書きされます。プログラムの異常な動作やコアダンプファイルが発生しない可能性があります。

ただし、スタックオーバーフローがポインタまたはリターンアドレスである一部のローカル変数を上書きする場合、ポインタを使用すると、ポインタは無効なアドレスになり、マップされていないメモリページを指すようになります。または、プログラムはポインタを使用して読み取り専用ページに書き込みます。 、セグメンテーション違反が発生し、コアダンプファイルが作成されます。または、リターンアドレスが上書きされ、CPUが無効なアドレス空間に戻るか、無効なコードを実行すると、例外が発生し、コアファイルが作成されます。

于 2012-11-16T07:59:54.653 に答える
1

これは、オペレーティングシステムと言語の実行時間によって異なります。コアダンプについて言及しているので、Unix/Linuxのフレーバーについて話していると思います。

通常、スタックを超えて、マップされていない仮想メモリがいくらか(おそらく1ページ)存在します。その量より少ない量でオーバーフローした場合、プログラムはそれにアクセスしようとし、セグメンテーション違反を引き起こします。プログラムがシグナルを処理しない場合、プログラムは中止されます。コアダンプが有効になっている場合は、コアダンプが生成されます。ulimit -c unlimitedプログラムの起動に使用するシェルから使用して、コアダンプを有効にする必要がある場合があります。

大量にオーバーフローした場合は、代わりにプログラムのメモリの他の部分を上書きする可能性があります。これが発生した場合、すべての賭けはオフになります。プログラムがクラッシュしたり、破損した状態で継続して、将来の任意の時点で何らかの損害を引き起こす可能性があります。

これは、「オーバーフロー」とは、深い呼び出しスタックと大きな自動オブジェクトの組み合わせによって割り当てられたよりも多くのスタックメモリを使用することを意味すると想定しています。スタックの間違った部分への書き込みについて話している場合(たとえば、自動配列への範囲外アクセスによる)、通常、セグメンテーション違反ではなくランダムなメモリ破損が発生します。この場合も、プログラムが破損した状態で混乱し、予期しない結果が生じる可能性があります。

于 2012-11-16T08:23:11.450 に答える