« [C#]文字列の一部の文字をバイト単位で抜き出す | トップページ | [C#]キャッチした例外の発生場所(ソースコードの行番号)を出力する »

2019年12月17日 (火)

[gfortran]配列へのインデックスの指定のチェックと-fbounds-checkオプション

Fortranの配列の要素番号(インデックス)は、通常は1~であり、値を取り出すために指定をするインデックスは自然数で指定することになる。しかし、デフォルトでは、このインデックスの指定のチェックは甘い。例えば以下のソースコードを実行してみる。

implicit none
integer a, b
dimension a(3)
a(1) = 1
b = 0
a(2) = a(b)
b = -1
a(3) = a(b)
write(*,'(3(I3,1X))') a(1),a(2),a(3)
end

実行すると、以下のようになる。

>gfortran.exe -o array.exe array.f
>array.exe
1 0 0

配列aのインデックスに0や-1を指定しているのに、値が取り出せてしまっている。これを防ぐためには、コンパイル時に-fbounds-checkオプションを使用する。

>gfortran.exe -fbounds-check -o array.exe array.f
>array.exe
At line 6 of file array.f
Fortran runtime error: Index '0' of dimension 1 of array 'a' below lower bound of 1
Error termination. Backtrace:
Could not print backtrace: libbacktrace could not find executable to open
(以下省略)

配列のインデックスに0を指定していることが、実行時にチェックされており、この例ではプログラムが緊急停止していることがわかる。なお、上記のことは以下のコンパイラーで実行している。環境はWindows。

>gfortran --version
GNU Fortran (MinGW.org GCC-8.2.0-3) 8.2.0

« [C#]文字列の一部の文字をバイト単位で抜き出す | トップページ | [C#]キャッチした例外の発生場所(ソースコードの行番号)を出力する »

Fortran」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« [C#]文字列の一部の文字をバイト単位で抜き出す | トップページ | [C#]キャッチした例外の発生場所(ソースコードの行番号)を出力する »

無料ブログはココログ

■■

■■■