У меня есть программа, которая присваивает значение массиву за его пределами, и я ожидал, что будет выдана ошибка времени выполнения. При этом никакой ошибки не возникает, и программа продолжает запись в необъявленную память. Есть ли какой-то вариант компилятора для защиты от этого? С показанным дампом памяти становится ясно, что это превышение границ реально. Есть ли способ объявить переменные или спецификации аргументов, чтобы поймать это? Очевидно, это очевидный случай, но когда мне поручают поддерживать тысячи строк кода, производного от 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
, потому что знаю, что с ней получаю.
Вот параметры компилятора для проверки во время выполнения.