我有一个程序,它分配了一个超出其界限的数组,我期待会抛出一个运行时错误。然而根本没有引发错误,程序继续写入未声明的内存。是否有一些编译器选项可以防止这种情况?通过显示的内存转储,很明显这种越界是真实的。有没有办法声明变量或参数规范来捕捉这个?显然,这是一个明显的案例,但是当负责维护数千行 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
编译器是 Intel Fortran 2011 XE,是的,我正在使用字节规范INTEGER*4
,因为我知道我得到了什么。
以下是运行时检查的编译器选项。