コンパイラは、局所変数がどのように使用されるかを予測して、副プログラムの呼び出しによって変更されない変数について仮説を立てます。次の例では、副プログラムで使用されているポインタが原因で、コンパイラによる最適化処理が正しく行われず、結果が予測できないものになっています。正しい結果が得られるようにするには、-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_loc が i のアドレスを取得して保存し、use_loc がそれを使用しています。これは、Fortran 規格に反しています。
-xalias=actual を使用してコンパイルすると、副プログラムへのすべての引数がそのコンパイル単位内の大域的な変数として見なされるべきであるとコンパイラに伝えられます。 このため、コンパイラは、実引数のように見える変数について仮説を立てるときに、より慎重になります。
Fortran 規格に反するこのようなプログラミングは避けるべきです。