範囲を超えて配列を割り当てるプログラムがあり、実行時エラーがスローされることを期待していました。それでもエラーはまったく発生せず、プログラムは宣言されていないメモリへの書き込みに進みます。これを防ぐためのコンパイラオプションはありますか?示されているメモリダンプを使用すると、この範囲の超過が現実のものであることが明らかです。これをキャッチするために変数または引数の仕様を宣言する方法はありますか?明らかにこれは明らかなケースですが、F77派生コードの数千行を維持するように任命された場合、これが起こっている可能性があるかどうかは(私には)必ずしも明確ではありません。
PROGRAM TEST_CODE
IMPLICIT NONE
INTEGER*4 :: R(5) ! Array of 5
CALL R_TEST(R, 10)
END PROGRAM
SUBROUTINE R_TEST(R, J)
IMPLICIT NONE
INTEGER*4, INTENT(INOUT) :: R(1) ! Dummy is array of 1
INTEGER*4, INTENT(IN) :: J
INTEGER*4 :: K
DO K=J-5,J+5 ! K=5..15
R(K) = K ! No Runtime Error
END DO
END SUBROUTINE
コンパイラーはIntelFortran2011 XEであり、バイト仕様を使用しているのは、それでINTEGER*4
何が得られるかを知っているからです。
ランタイムチェックのコンパイラオプションは次のとおりです。