零大小的数组和数组边界检查

时间:2011-04-12 11:03:56

标签: fortran gfortran sunstudio

使用GNU Fortran(v4.4.3)或Sun Studio F95(v8.3)编译时,没有数组边界检查以下程序运行时没有错误。但是,当打开数组边界检查(分别为gfortran -fbounds-checkf95 -C)时,GNU编译的可执行文件会再次运行而不会出现错误,而Sun Studio编译的可执行文件会产生运行时错误,

 ******  FORTRAN RUN-TIME SYSTEM  ******
Subscript out of range. Location:  line 44 column 20 of 'nosize.f90'
Subscript number 2 has value 1 in array 't$27'

调用sub2()时出错,它使用x的自动数组伪参数。使用编译器和任何标志都可以正常运行sub1()

据我所知,这个程序是“合法的”,因为零大小的数组可能像非零大小的数组一样被引用,并且没有x的零长度维度的显式索引。但是,我在这里缺少一些零大小的数组切片或自动数组微妙吗?我是否应该期望数组边界检查在不同的编译器中表现相同,或者我应该将其视为特定于供应商的扩展?

MODULE subs
  IMPLICIT NONE
CONTAINS    
  SUBROUTINE sub1(x)
    IMPLICIT NONE
    REAL :: x(:,:)
    PRINT*,'------------------------------------'
    PRINT*,SHAPE(x)
    PRINT*,SIZE(x)
  END SUBROUTINE sub1

  SUBROUTINE sub2(n1,n3,x)
    IMPLICIT NONE
    INTEGER,INTENT(in) :: n1, n3
    REAL :: x(n1,n3)
    PRINT*,'------------------------------------'
    PRINT*,SHAPE(x)
    PRINT*,SIZE(x)
  END SUBROUTINE sub2
END MODULE subs


PROGRAM nosize
  USE subs
  IMPLICIT NONE    
  INTEGER :: n1 = 2, n2 = 2, n3 = 0
  REAL,ALLOCATABLE :: x(:,:,:)

  ALLOCATE(x(n1,n2,n3))
  x(:,:,:) = -99.9

  PRINT*,'ALLOCATED? ',ALLOCATED(x)
  PRINT*,'SHAPE =',SHAPE(x)
  PRINT*,'SIZE  =',SIZE(x)
  PRINT*,'X     =',x

  CALL sub1(x(:,1,:))
  CALL sub2(n1,n3,x(:,1,:))

END PROGRAM nosize

1 个答案:

答案 0 :(得分:4)

使用-check bounds对intel的fortran编译器没有任何问题; IBM的xlf,根据我的经验非常严格,也没有抱怨-qcheck。

但更广泛地说,是的,关于检查边界应该或不应该做什么都没有标准。我当然可以看到为什么有些编译器标记为零长度数组的赋值为坏/错/奇怪;这是一个奇怪的角落案例。