Oracle® Solaris Studio 12.4: Fortran ユーザーズガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

3.4.114 -xcheck[=keyword[,keyword]]

実行時の特別な検査を生成します。

キーワードには次のいずれかを指定します。

keyword
機能
stkovf[action]
実行時にスタックオーバーフローエラーを検出するためのコードを生成します。オプションで、スタックオーバーフローエラーが検出されたときに行うアクションを指定します。
スタックオーバーフローエラーは、スレッドのスタックポインタがスレッドに割り当てられているスタック境界を越えた位置に設定されると発生します。新しいスタックアドレスの先頭が書き込み可能である場合は、エラーが検出されないことがあります。
エラーの直接の結果としてメモリーアクセス違反が発生した場合、スタックオーバーフローエラーが検出され、関連付けられているシグナル (通常は 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 実行時ライブラリは、スタックオーバーフローの検出をサポートしません。
no%stkovf
スタックオーバーフローの実行時の検査を無効にします
init_local
局所変数の特定の初期化を実行します。
コンパイラは局所変数を、代入される前にプログラムが使用すると算術例外を起こす可能性がある値に初期化します。ALLOCATE 文によって割り当てられたメモリーも同じように初期化されます。
モジュール変数、STATIC ローカル変数と SAVE ローカル変数、および COMMON ブロックの変数は初期化されません。
詳細は、『C ユーザーズガイド』を参照してください。
no%init_local
局所変数の初期化を無効にします。これはデフォルト値です。
%all
実行時のすべての検査機能を有効にします。
%none
実行時のすべての検査機能を無効にします。

スタックオーバーフローは、特に、スタックに大きな配列が割り当てられるマルチスレッドアプリケーションで、近傍のスレッドスタックのデータを警告なしに破壊する可能性があります。スタックオーバーフローの可能性がある場合は、-xcheck=stkovf を使用してすべてのルーチンをコンパイルします。ただし、このフラグを使用してコンパイルしても、このフラグを使用せずにコンパイルしたルーチンでスタックオーバーフローが起こる可能性があるので、すべてのスタックオーバーフローの状況が検出されるわけではありません。