Sun Studio 12: Fortran プログラミングガイド

7.6.2.5 実引数による別名参照

コンパイラは、局所変数がどのように使用されるかを予測して、副プログラムの呼び出しによって変更されない変数について仮説を立てます。次の例では、副プログラムで使用されているポインタが原因で、コンパイラによる最適化処理が正しく行われず、結果が予測できないものになっています。正しい結果が得られるようにするには、-xalias=actual フラグを使用してコンパイルする必要があります。


 program foo
      integer i
      call take_loc(i)
      i = 1
      print * , i
      call use_loc()
      print * , i
   end

   subroutine take_loc(i)
      integer i
      common /loc_comm/ loc_i
      loc_i = loc(i)
   end subroutine take_loc

   subroutine use_loc()
      integer vi1
      pointer (pi,vi)
      common /loc_comm/ loc_i
      pi = loc_i
      vi1 = 3
   end subroutine use_loc

take_loci のアドレスを取得して保存し、use_loc がそれを使用しています。これは、Fortran 規格に反しています。

-xalias=actual を使用してコンパイルすると、副プログラムへのすべての引数がそのコンパイル単位内の大域的な変数として見なされるべきであるとコンパイラに伝えられます。 このため、コンパイラは、実引数のように見える変数について仮説を立てるときに、より慎重になります。

Fortran 規格に反するこのようなプログラミングは避けるべきです。