Проверка привязки пустых массивов --- поведение различных компиляторов

У меня сложилось впечатление, что Фортран хорош с массивами размера 0. Однако с Absoft Pro 21.0 я столкнулся с (странной) ошибкой, связанной с такими массивами. Напротив,,,,, и довольны одним и тем же фрагментом кода.

Ниже приведен минимальный рабочий пример.

      ! testempty.f90

!!!!!! A module that offends AF90/AF95 !!!!!!!!!!!!!!!!!!!!!!!!
module empty_mod

implicit none
private
public :: foo

contains

subroutine foo(n)
implicit none
integer, intent(in) :: n
integer :: a(0)
integer :: b(n - 1)
call bar(a)  ! AF90/AF95 is happy with this line.
call bar(b)  ! AF90/AF95 is angry with this line.
end subroutine foo

subroutine bar(x)
implicit none
integer, intent(out) :: x(:)
x = 1  ! BAR(B) annoys AF90/AF95 regardless of this line.
end subroutine bar

end module empty_mod
!!!!!! Module ends !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


!!!!!! Main program !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
program testempty

use empty_mod, only : foo

implicit none

call foo(2)  ! AF90/AF95 is happy with this line.
call foo(1)  ! AF90/AF95 is angry with this line.
write (*, *) 'Succeed!'  ! Declare victory when arriving here.

end program testempty
!!!!!! Main program ends !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Назовите этот фрагмент кода как testempty.f90. Тогда беги

      $ af95 -no-pie -et -Rb -g -O0 -o atest testempty.f90
$ ./atest

Вот что произошло на моей машине (Ubuntu 20.04, linux 5.4.0-77-generic, x86_64):

      ./atest
? FORTRAN Runtime Error:
? Subscript 1 is out of range for dimension 1 for array 
? B with bounds 1:
? File testempty.f90; Line 19
? atest, run-time exception on Mon Sep 13 14:08:41 2021
? Program counter: 000000001004324B
? Signal SIGABRT, Abort
? Traceback follows
OBJECT             PC                ROUTINE                LINE  SOURCE
libpthread.so.0    000000001004324B  raise                   N/A  N/A
atest              00000000004141F3  __abs_f90rerr           N/A  N/A
atest              000000000041CA81  _BOUNDS_ERROR           N/A  N/A
atest              00000000004097B4  __FOO.in.EMPTY_MO       N/A  N/A
atest              000000000040993A  MAIN__                   40  testempty.f90
atest              000000000042A209  main                    N/A  N/A
libc.so.6          000000000FD0C0B3  __libc_start_main       N/A  N/A
atest              000000000040956E  _start                  N/A  N/A

Так раздражало call bar(b). С, результат был такой же.

Я тестировал тот же код, используя gfortran, ifort, nagfor, pgfortran, sunf95, а также g95. Все они были вполне довольны кодом, хотя я явно ввел проверку привязки. Ниже Makefile для тестов.

      # This Makefile tests the following compilers on empty arrays.
#
# af95: Absoft 64-bit Pro Fortran 21.0.0
# gfortran: GNU Fortran (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
# ifort: ifort (IFORT) 2021.2.0 20210228
# nagfor: NAG Fortran Compiler Release 7.0(Yurakucho) Build 7036
# pgfortran: pgfortran (aka nvfortran) 21.3-0 LLVM 64-bit x86-64
# sunf95: Oracle Developer Studio 12.6
# g95: G95 (GCC 4.0.3 (g95 0.94!) Jan 17 2013)
#
# Tested on Ubuntu 20.04 with Linux 5.4.0-77-generic x86_64

.PHONY: test clean

test:
    make -s gtest
    make -s itest
    make -s ntest
    make -s ptest
    make -s stest
    make -s 9test
    make -s atest

gtest: FC = gfortran -Wall -Wextra -fcheck=all
itest: FC = ifort -warn all -check all
ntest: FC = nagfor -C
ptest: FC = pgfortran -C -Mbounds
stest: FC = sunf95 -w3 -xcheck=%all -C
9test: FC = g95 -Wall -Wextra -fbounds-check
atest: FC = af95 -no-pie -et -Rb

%test: testempty.f90
    $(FC) -g -O0 -o $@ $<
    ./$@

clean:
    rm -f *.o *.mod *.dbg *test

Вопросов:

  1. Поведение af95/ af90 соответствует стандарту?
  2. Содержит ли мой код что-нибудь, нарушающее стандарты Fortran?
  3. Считается ли вообще опасным задействовать пустые массивы в коде Fortran? Иногда они неизбежны, учитывая тот факт, что размеры данных часто невозможно определить до выполнения.

Под «стандартами» я имею в виду 2003, 2008 и 2018 годы.

Большое спасибо за любые комментарии или критику.

(Тот же вопрос задан в Fortran Discourse , и я надеюсь, что он не нарушает здесь правил.)

1 ответ

Программа мне нравится. Массивы нулевого размера вполне возможны в Фортране, хотя я признаю, что обычно у меня нет автоматических массивов - но это просто совпадение.

Я думаю, что это ошибка компилятора в компиляторе Absoft или в его проверке границ массива.

Другие вопросы по тегам