首页 > 解决方案 > 在编译或运行时检测错误的别名

问题描述

是否有一些工具(或编译标志)可以在编译期间或运行时检测 Fortran 代码中有问题的别名?我看到 gfortran 有-Waliasing,但它只检测到最严重的情况(例如call whatever(x,x),但不是call whatever(x(1),x(1)))。英特尔的 ifort 有-fno-alias,但显然这只是意味着编译后的代码可能会给出不同的结果。考虑这样的代码:

program main
implicit none
real :: x(100)
integer :: i

do i=1,size(x)
  x(i) = i
end do

call sub(100,x(1:100),x(1:100))

contains

subroutine sub(n,a,b)
implicit none
integer, intent(in) :: n
real, intent(in) :: a(n)
real, intent(out) :: b(n)

b(:) = a(:)

end subroutine sub

end program main

我没有收到任何警告(编译或运行),因为x(1:100)两个虚拟参数(ab)使用相同的内存地址(),其中一个被修改,据我所知,这是标准禁止的.

标签: compilationfortran

解决方案


推荐阅读