GCC はスタックがオーバーフローしないことをどのように保証しますか? 特に暗黙的に定義されている場合、サイズが保持できる最大値よりも小さいことを確認し、それに応じてユーザーにプロンプトを表示するべきではありませんか?これは優れたプログラミング パラダイムではないでしょうか?
2 に答える
そうではありません。十分に深く再帰すると、オーバーフローが発生し、コンパイラがそれに対してできることは何もありません。
編集:私がこの質問に答えた時点で、質問は単に次のように書かれていることを指摘しておく必要があります。
「GCC はスタックがオーバーフローしないことをどのように保証しますか?」
Linuxは「ガードエリア」を使用します。各スレッドのスタックの最後に1つ以上のアクセス保護ページを配置します。
プログラムがガードエリアにアクセスすると、OSが障害を処理します。スレッドがすでに最大許容スタックを使用している場合は、何かを終了します(スレッドまたはプロセス全体、どちらかは覚えていません)。それ以外の場合は、スタックとして使用するためにガード領域が占めるアドレスにメモリをマップしようとし、新しく拡大されたスタックの終わりを超えて新しい領域を保護します。
ユーザーにプロンプトを表示することは、多くのプロセスがユーザーによって監視されていないLinuxのようなOSにはあまり適していません。さらに言えば、問題が発生したときにログインしているユーザーがいない可能性があります。したがって、プロセスは失敗します。これは万能コンパイラであるため、gccは実行時のユーザーインタラクションも試行しません。
他のOSおよびプラットフォームには、スタックガードページがある場合とない場合があります(Windowsにはあります)。gccが実際に行う必要があるのは、スタックを超えた場合に、ずっと前にジャンプしてガードページを「見逃さない」ようにすることです。