[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.7.2 スタック検査方法の指定

GNU CC は、‘-fstack-check’ が指定された場合は、 スタックの参照がスタックの境界内に収まっているかどうかを検査する。 検査方法は以下の三つの内の一つである。

  1. マクロ STACK_CHECK_BUILTIN の値がゼロでなければ、 GNU CC は、スタック検査をコンフィギュレーションファイルの適切な 場所、例えば FUNCTION_PROLOGUE で設定済みであると想定する。 GNU CC は他には特別な処理は行なわない。
  2. STACK_CHECK_BUILTIN がゼロで、‘md’ファイルで名前付きパターン check_stack を定義していれば、GNU CC はそのパターンを、 スタック値と比較するアドレスである引数を一つ付けて、呼び出す。 スタックポインタが範囲外にある場合はエラーを報告するように、このパターン を設定しなければならない。
  3. 上のどちらも真でない場合は、GNU CC は、以下で定義するマクロの値を 使って、定期的にスタックポインタを探るコードを生成する。

普通は以下のマクロの値としてデフォルト値が使われるので、GNU CC は 三番目の方法を取ることになる。

STACK_CHECK_BUILTIN

スタック検査が、機種依存の方法でコンフィギュレーションファイルにより 行なわれるなら、ゼロでない値となる。 読者の機種の ABI がスタック検査を要求しているか、GNU CC の移植性の良い 方法よりも幾らか効率の良いスタック検査を行なわせたいのなら、 このマクロを定義すべきである。 このマクロのデフォルト値はゼロである。

STACK_CHECK_PROBE_INTERVAL

GNU CC がスタックの探針用命令を生成しなければならない間隔を 表す整数である。普通は、スタック領域の終りの「ガード・ページ」の大きさ よりも大きくならないように、このマクロを定義する。 デフォルト値の 4096 がほとんどのシステムで適切である。

STACK_CHECK_PROBE_LOAD

GNU CC がスタック探針をロード命令として実行すべきならゼロでない整数となり、 ストア命令を使うべきならゼロとなる。 デフォルトはゼロであり、ほとんどのシステムで最も効率の良い選択である。

STACK_CHECK_PROTECT

スタックのオーバフローから回復するのに必要なスタックのバイト数。 デフォルト値の 75 ワードがほとんどの機種で適切である。

STACK_CHECK_MAX_FRAME_SIZE

あるスタックフレームの最大の大きさをバイト数で表す。 GNU CC は、非末端関数では、少なくともこれだけのバイト数のスタックが 利用可能であることを保証する探針命令を生成する。 スタックフレームがこの大きさよりも大きいときは、スタック検査は 信頼できなくなり、GNU CC は警告を発する。 デフォルトは、GNU CC がほとんどのシステムで一個の命令しか生成しないように 選ばれる。普通は、このマクロのデフォルト値は変えるべきではない。

STACK_CHECK_FIXED_FRAME_SIZE

GNU CC はこの値を見て、上述の警告メッセージを生成する。 これは、ある関数で使われるフレームの固定部分の大きさを表し、 非呼びだし側セーブのレジスタ、一時変数とユーザ定義変数の領域は 含まない。この量については上限を指定するだけで良く、普通は デフォルトの 4 ワードを使う。

STACK_CHECK_MAX_VAR_SIZE

-fstack-check’ が指定された場合に、GNU CC がスタックフレームの 固定領域に置くオブジェクトの最大の大きさをバイト数で表したもの。 GNU CC は、上記のマクロの値からデフォルト値を計算する。 普通はそのデフォルトを書き換える必要はない。


This document was generated using texi2html 1.78.