スタック オーバーフローを処理するための定義済みの動作はありますか?
プロセスを終了する以外に、できることはあまりないようです。C標準がそれについて何を言わなければならないかを誰かが知っているのではないかと思っています。
スタック オーバーフローを処理するための定義済みの動作はありますか?
プロセスを終了する以外に、できることはあまりないようです。C標準がそれについて何を言わなければならないかを誰かが知っているのではないかと思っています。
標準はスタックの使用を要求しておらず、スタック オーバーフローについては何も述べていません。
C99 標準ではスタックは定義されていません。抽象的には自動または割り当てられたストレージについてのみ説明しますが、オーバーフロー検出を備えた連続スタックは、自動ストレージを実装するためのメカニズムの 1 つにすぎません。
標準のセクション 7.14 では、SIGSEGV を「ストレージへの無効なアクセス」で発生するシグナルとして定義しています。C の実装はシグナルを生成する必要はありませんが、連続した固定サイズのスタック* を使用する実装は通常、スタック オーバーフローが検出された場合に SIGSEGV をシグナルします。
SIGSEGV のシグナル ハンドラー関数を登録できますが、"[i]f を返すことはできません。また、sig の値が SIGFPE、SIGILL、SIGSEGV、または a に対応するその他の実装定義の値である場合、関数が返される場合計算上の例外、動作[u]rは定義されていません" .
(* 意図的に C 実装を使用したことがないわけではありませんが、他の環境で拡張可能な自動ストレージ ドメインを実装するために使用される一般的な手法の使用を C 標準で妨げているものは何も知りません)
C標準はスタックを定義していないため、スタックがオーバーフローしたときに何が起こるかを定義していません。
ここでの答えは、c標準とは何の関係もないという点で正しいですが、「プロセスを終了することを除けば、できることはたくさんあるようには見えません」というあなたの声明はそうではありません-一般論として-真実。
実際、仮想メモリ管理とオンデマンド ページングを備えたほとんどのシステムでは、割り当てられたスタックは非常に小さく (通常、現在使用されているよりも 4KB 多い)、しばしばオーバーフローし (ページ フォールト割り込みが生成されます)、OS は単純に別のページを追加します。スレッドのスタックへのメモリ。
通常は 1MB のスタック制限は、ランナウェイ プログラムを防ぐために選択されたかなり恣意的な数値であり、一般に絶対的な制限ではありません (ただし、Intel プロセッサ IIRC を搭載した一部のメモリ モデルではそうでした)。通常、各スレッドに 1MB の物理メモリを割り当てることは意味がありません。
この質問に対するいくつかの回答によると、C 標準には、スタック オーバーフローはおろか、スタックの存在についても何も記載されていません。
C 標準は、この点で矛盾しています。次のプログラムを検討してください。
void foo(uintptr_t n)
{
int a;
printf("%p\n", (void *)&a);
if (n+1) foo(n+1);
}
int main()
{
int a;
printf("%p\n", (void *)&a);
foo(0);
}
このプログラムは完全に準拠しており、最小翻訳制限に違反していません。他の人が言っているように、標準の言語にはスタック制限/オーバーフローについて何もありません。ただし、(各呼び出しレベルで) UINTPTR_MAX
+2 個のオブジェクトが生成され、その有効期間はすべて重複し、それぞれが異なるアドレスを持ちます。a
これは単なる数え上げでは不可能です。
何が起こるかの詳細はオペレーティングシステムによって定義されていると確信していますが、すべての場合において、プログラムは終了する必要があります。スタック オーバーフローが発生すると (少なくともプログラマーとして) できることは何もないと想定するのは正しいことです。あなたが本当にできることは、そもそもそれらが起こらないようにすることだけです.
それはオペレーティングシステム次第です。ただし、多くのオペレーティング システムでは、デフォルトのスタック サイズを上書きできます。たとえば、Windows では、このリンカー フラグを使用して、スタック サイズを 1 MB からより大きな値に増やすことができます。
他の人が言及したように、標準はスタックについて何も述べていません。
しかし、スタックオーバーフローの動作を定義するためだったと思います。標準では、未定義の動作になると言われています。
::リムショット::