Проверка размера массива, переданного функции - PullRequest
6 голосов
/ 28 июня 2019

Я обнаружил ошибку в большой программе, где подпрограмма была записана как:

program main
  implicit none

  real, dimension(6) :: x
  call f(x, 7)
  write (*,*) x
contains
  subroutine f(x, n)
    integer :: n
    real, dimension(n) :: x

    integer :: i

    do i = 1, n
      x(i) = 0.0
    end do
  end subroutine f
end program main

Эта программа отлично работает с проверкой ifort, gfortran и bounds, хотя код явно глючит. Есть ли возможность ловить такие ошибки?

PS: вот две команды, которые генерируют двоичные файлы, которые работают нормально

  • ifort -check all main.f90 -o main
  • gfortran -fbounds-check main.f90 -o main

Ответы [ 2 ]

2 голосов
/ 01 июля 2019

Это важный класс ошибок программирования, когда компиляторы не слишком хороши, когда дело доходит до обнаружения экземпляров.Как отмечается в вопросе, компиляторы Intel и GNU не могут обнаружить проблему при компиляции с проверкой границ доступа к массиву.

Действительно, мне не известны другие флаги, которые включают такую ​​проверку в компиляторе во время выполнения.время.

Однако в некоторых случаях и gfortran, и ifort могут уловить ошибку.Когда фактическое значение или аргумент имеют явный размер, заданный константным выражением, и интерфейс подпрограммы «известен» (не обязательно явный), может быть обнаружена ошибка.С gfortran процедура, находящаяся в том же файле, может включить эту проверку, а с помощью ifort опция -warn interfaces (возможно, после -gen_interfaces) делает то же самое.

Теперь, это важный класс ошибокмы можем выйти за пределы простых границ вопроса.Как говорится в ответе от PTRK , ошибку можно смягчить, если не использовать явные фиктивные фигуры.

Кроме того, компилятор NAG, например, предлагает такие проверки во время выполнения для фактическихаргументы не короче, чем связанные фиктивные аргументы.Скомпилированный с -C код вопроса дает ошибку времени выполнения:

line 8: Invalid reference to procedure MAIN:F - Dummy array X (number 1) has 7 elements but actual argument only has 6 elements
Program terminated by fatal error

Всегда стоит рассмотреть различные инструменты для выявления различных аспектов потенциальных ошибок программирования или неразумных практик.

2 голосов
/ 01 июля 2019

Отказ от ответственности: Автор просит опцию, чтобы поймать ошибку.Этот ответ не дает этого.


Если массив имеет предполагаемую форму (dimension(:)), выполняется проверка:

ifort 15,5

forrtl: severe (408): fort: (2): Subscript #1 of the array X has value 7 which is greater than the upper bound of 6

gfortran 6.1.0

Fortran runtime error: Index '7' of dimension 1 of array 'x' above upper bound of 6

, тогда как при его и предполагаемом размере (dimension(*)) или явной форме (dimension(n)) это не так.Он может быть специально разработан.

ifort manual

Проверка границ массива не выполняется для массивов, являющихся фиктивными аргументами, в которых последняя граница измерения указана как * или когда оба верхних инижние размеры - 1.

gfortran, руководство не указывает эту точку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...