実行時にスタックオーバーフローエラーを検出するためのコードを生成します。オプションで、スタックオーバーフローエラーが検出されたときに行うアクションを指定します。
スタックオーバーフローエラーは、スレッドのスタックポインタがスレッドに割り当てられているスタック境界を越えた位置に設定されると発生します。新しいスタックアドレスの先頭が書き込み可能である場合は、エラーが検出されないことがあります。
エラーの直接の結果としてメモリーアクセス違反が発生した場合、スタックオーバーフローエラーが検出され、関連付けられているシグナル (通常は SIGSEGV) が発行されます。このように発生したシグナルは、そのエラーに関連付けられていると言います。
-xcheck=stkovf[action] を指定すると、コンパイラはシステムのページサイズより大きいスタックフレームが使用される場合にスタックオーバーフローエラーを検出するためのコードを生成します。このコードには、無効であるがマップされている可能性があるアドレスにスタックポインタを設定する代わりに、メモリーアクセス違反を強制的に発生させるためのライブラリ呼び出しが含まれています (_stack_grow(3C) を参照)。
オプションの action を指定する場合は、:detect または :diagnose にする必要があります。
action が :detect の場合は、そのエラーに通常関連付けられているシグナルハンドラを実行することによって、検出されたスタックオーバーフローエラーが処理されます。
action が :diagnose の場合は、関連付けられているシグナルを捕捉し、stack_violation(3C) を呼び出してエラーを診断することによって、検出されたスタックオーバーフローエラーが処理されます。これはactionを指定しない場合のデフォルト動作です。
メモリーアクセス違反がスタックオーバーフローエラーと診断されると、次のメッセージが標準エラー出力に出力されます。
ERROR: stack overflow detected: pc=<inst_addr>, sp=<sp_addr>
ここで、<inst_addr> はエラーが検出された命令のアドレスであり、<sp_addr> はエラーが検出されたときのスタックポインタの値です。スタックオーバーフローを検査して前述のメッセージを出力した (該当する場合) あとに、そのエラーに通常関連付けられているシグナルハンドラに制御が渡されます。
-xcheck=stkovf:detect は、システムのページサイズより大きいスタックフレームを持つルーチンに入るときのスタック境界の検査を追加します (_stack_grow(3C) を参照)。追加の境界の検査に関連するコストは、ほとんどのアプリケーションで無視できる程度です。
-xcheck=stkovf:diagnose はスレッドを作成するためのシステムコールを追加します (sigaltstack(2) を参照)。追加のシステムコールに関連するコストは、アプリケーションが新しいスレッドを作成および破棄する頻度によって異なります。
-xcheck=stkovf は、Oracle Solaris のみでサポートされます。Linux の C 実行時ライブラリは、スタックオーバーフローの検出をサポートしません。
|