Fortran 将同一实体传递给具有不同意图的参数是否为未定义行为?

Fortran 将同一实体传递给具有不同意图的参数是否为未定义行为?,fortran,fortran90,Fortran,Fortran90,在这段代码中,我将相同的数组I传递给baz,将其绑定到具有不同意图的参数。当然,当我打印a时,它会发生变化。这是未定义的行为,还是符合规范 请注意,我完全期待这种情况发生。我对这种行为并不感到困惑,我只是想知道它是否有效。这是一种未定义的行为。Fortran通常禁止参数别名(即指向同一实际数据的多个参数),除非这些参数具有指针或目标属性。从技术上讲,编译器应该能够捕获并禁止这种情况,为什么不这样呢?@StefanoBorini:1)编译器开发人员没有无限的时间。2) IIRC别名可能被允许用于未

在这段代码中,我将相同的数组
I
传递给baz,将其绑定到具有不同意图的参数。当然,当我打印
a
时,它会发生变化。这是未定义的行为,还是符合规范


请注意,我完全期待这种情况发生。我对这种行为并不感到困惑,我只是想知道它是否有效。

这是一种未定义的行为。Fortran通常禁止参数别名(即指向同一实际数据的多个参数),除非这些参数具有指针或目标属性。

从技术上讲,编译器应该能够捕获并禁止这种情况,为什么不这样呢?@StefanoBorini:1)编译器开发人员没有无限的时间。2) IIRC别名可能被允许用于未写入的参数,或者被广泛使用,因此必须得到支持。3) 检查非平凡案例和不引入误报的困难(见(2))。这并不容易。问题只会在某些情况下出现,即改变参数时。人们应该阅读标准。如果两者都是
intent(IN)
,则完全可以。如果参数的on由
传递,则同样适用。非法情况与编译器需要检测的非法情况之间存在差异。这是一个相关的问题:
module foo
contains
   subroutine bar()
      integer :: i(3)

      i(1) = 1
      i(2) = 2
      i(3) = 3
      call baz(i, i)
   end subroutine

   subroutine baz(a,b)
      integer, intent(in) :: a(:)
      integer, intent(inout) :: b(:)

      b(2) = 5
      print *, a
      print *, b
   end subroutine

end module
program xx
   use foo
   call bar()
end program