3

Linux は、最小サイズが保証されている下位スタック エンドの下にアクセスできないメモリ領域を提供しますか? そして、そのような保証された最小サイズが存在する場合、それは何ですか?

alloca()言い換えれば、有効な非スタック メモリへのポインターをいつ心配し始めるべきでしょうか。

4

2 に答える 2

4

alloca のマニュアルページには次のように書かれています。

スタック フレームを拡張できない場合、エラーは表示されません。(ただし、割り当てに失敗した後、プログラムが未割り当て領域にアクセスしようとすると、SIGSEGV シグナルを受信する可能性があります。)

したがって、兆候はまったくなく、次のようにも書かれています。

割り当てによってスタック オーバーフローが発生した場合、プログラムの動作は未定義です。

スタック オーバーフローの問題は、再帰に関する一般的な問題であり、alloca可変長配列に固有のものではありません。通常、再帰の深さを制限する方法を見つけるか、反復ソリューションにリファクタリングするか、独自の動的スタックを使用する必要があります (おそらくこのケースには当てはまりません)。

アップデート

OPが発見したように、Linuxは、質問の最初の部分に対処する信号を生成することにより、スタックオーバーフローのスタックの後にガードページを使用して事後表示を提供します。SIGBUS

于 2014-03-20T17:44:13.000 に答える