このセクションでは、例外とランタイムエラーの場所を特定するためのいくつかのガイドラインを示します。インテル® Fortran のランタイム・エラー・メッセージは、通常、エラーを引き起こしているソース内の正確な位置を示しません。エラーと例外の処理に関するコンパイラー・オプションは次のとおりです。
-check [keyword] オプション (Linux* および Mac OS* X) または /check[:keyword] オプション (Windows*) は、ランタイム時に特定の状態をキャッチするように追加のコードを生成します。例えば、bounds キーワードを指定すると、デバッガーは配列または文字列の境界エラーを特定し、実行を停止します。bounds キーワードを指定して、配列の添字および部分文字列を処理する式に対して、コンパイル時およびランタイム時のチェックを実行することができます。配列添字が配列に設定された次元境界を超えていたり、文字長を超えている場合、エラーが報告されます。uninit キーワードは、初期化されていない変数の動的チェックを行うコードを生成します。変数が書き込まれる前に読み取られる場合、ランタイム・エラー・ルーチンが呼び出されます。noformat キーワードおよび nooutput_conversion キーワードは、ランタイムエラーの重要度を下げ、プログラムの実行を続けます。pointers キーワードは、関連付けが解除されたポインターと割付けできない配列を確認するコードを生成します。
次の -check pointers (Linux および Mac OS X) または /check:pointers (Windows) の例は、さまざまなメッセージを出力します。
例 1: 割り付けられていない割付変数
real, allocatable:: a(:) ! allocate(a(4)) ! if a is unallocated, the next statement gets an error with "check pointers" a=17 print *,a end Output 1: forrtl: severe (408): fort: (8): Attempt to fetch from allocatable variable A when it is not allocated
例 2: 関連付けられていないポインター
real, pointer:: a(:) allocate(a(5)) a=17 print *,a deallocate(a) ! once a is deallocated, the next statement gets an error with "check pointers" a=20 print *,a end Output 2: 17.00000 17.00000 17.00000 17.00000 17.00000 forrtl: severe (408): fort: (7): Attempt to use pointer A when it is not associated with a target
例 3: ゼロ値の Cray* ポインター
pointer(p,a) real, target:: b ! p=loc(b) ! if integer pointer p has no address assigned to it, ! ! the next statement gets an error with "check pointers" b=17. print *,a end Output 3: forrtl: severe (408): fort: (9): Attempt to use pointee A when its corresponding integer pointer P has the value zero
-ftrapuv オプション (Linux および Mac OS X) または /Qtrapuv オプション (Windows) は、初期化されていない変数を検出するのに役立ちます。このオプションは、スタックに割り当てられている初期化されていないローカル変数に、一般的に非常に大きな整数または無効なアドレスとして解釈される値を設定します。アプリケーションで適切に初期化されていない、これらの変数を参照すると、ランタイムエラーが発生し、コーディング・エラーを検出するのに役立ちます。
-traceback オプション (Linux および Mac OS X) または /traceback オプション (Windows) は、ランタイム時に致命的なエラーが発生したとき、ソースファイルのトレースバック情報を表示できるように、オブジェクト・ファイル内に補足情報を生成します。これにより、致命的なランタイムエラーの原因を特定する作業が簡単になります。-traceback オプションを指定せずに、.MAP ファイルと、致命的なエラーが発生したときに表示されるスタックの 16 進アドレスをもとに、エラーの原因を特定できる場合もあります。「/traceback オプションの使用」で説明しているように、致命的なランタイムエラーでは、いくつかのトレースバック関連の情報が提供されます。
-fpe オプション (Linux および Mac OS X) または /fpe オプション (Windows) は、ランタイム時の浮動小数点算術例外 (IEEE 算術) の処理方法を制御します。-fpe3 コンパイラー・オプション (Linux および Mac OS X) または /fpe:3 コンパイラー・オプション (Windows) を指定すると、すべての浮動小数点例外が無効になり、IEEE 例外値が許容され、プログラムが続行されます。これとは対照的に、-fpe0 または /fpe:0 を指定すると、例外値 (NaN など) が生成されたり、または正規化されていない数 (通常はエラーの原因を特定できる) を使用しようとした際に実行を停止します。
-warn と -nowarn (Linux および Mac OS X) または /warn と /nowarn (Windows) は、コンパイル時の警告メッセージを制御します。コンパイル時の警告メッセージは、ランタイムエラーの原因を判断するのに役立つ場合があります。
Linux および Mac OS X システムでは、-fexceptions オプションは、C++ 例外処理テーブルの生成を有効にし、言語が混在したアプリケーションの Fortran ルーチンが、C++ ルーチン間の例外処理に影響されないようにします。
Windows システムでは、IDE のコンパイル診断オプションは、コンパイル時の診断メッセージを制御します。状況によってはランタイムエラーの原因を判断するのに役立つことがあります。