2

C では、alloca() 関数は alloca() の呼び出し元のスタックフレームにメモリを割り当てます。

おそらく割り当てられない膨大な数のバイトを割り当てようとするとどうなりますか?

  • スタックがヒープ セグメントに達するまで、できるだけ多くのバイトを割り当てますか?
  • それとも何も割り当てませんか?

    alloca(10000000000000000000);

マニュアルには次のように記載されています。

alloca() 関数は、割り当てられたスペースの先頭へのポインタを返します。割り当てによってスタック オーバーフローが発生した場合、プログラムの動作は未定義です。

動作が未定義であることを理解しています。しかし、それ以上に言うべきことがあります。

  • main が呼び出される前のスタックの一番上の後の最初のバイトへのポインターは何を返しますか?
  • alloca() が返された後、スタック ポインターは alloca() が呼び出される前とは異なりますか?

誰かがこれについてもっと情報を持っていますか?

4

4 に答える 4

3

何が起こるかは、コンパイラと使用中の強化オプションによって異なります。通常、それが失敗したことを示す兆候はなく、alloca. いくつかの強化オプションを使用すると、クラッシュを信頼できるものにすることができますが、障害を検出して回復することはできません。alloca単に使用すべきではありません。あまりにも良さそうに見えたのは悪い間違いでした。

于 2014-03-11T23:25:38.247 に答える
1

厳密に言えば、「未定義の動作」自体は定義されていないため、誰も知りません。(たとえば、 alloca は C または POSIX 標準では定義されていません)。

説明のためだけに、C の「未定義の動作」の定義は次のとおりです (ISO 9899:1999、セクション 3.4.3)。

「この国際規格が要件を課していない、移植性のない、または誤ったプログラム構造または誤ったデータの使用時の動作

「注記 考えられる未定義の動作は、状況を完全に無視して予測不可能な結果を​​もたらすことから、変換中またはプログラム実行中の、環境に特有の文書化された方法での動作 (診断メッセージの発行の有無にかかわらず)、変換または実行の終了 (診断メッセージの発行)。」

だから:絶対に何でも起こり得る. ハードディスクが再フォーマットされる可能性があります。空が落ちるかもしれません。

alloca によって引き起こされたスタック オーバーフローの後で、プログラムがプログラムの動作についてそのような想定 (または依存) を行う場合、そのプログラムは壊れています。そのような状況で特定のコンパイラが何をするかを推測しないことが最善です。あなたのプログラムは壊れており、話の終わりです。

于 2014-03-11T23:26:31.347 に答える