[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」カテゴリの記事
- [Fortran]文字列の前後の空白を取り除く(2023.03.05)
- [Fortran]write文で出力時に改行させない(2021.01.31)
- [Fortran]サブルーチンの引数にサブルーチンを指定する(2021.01.09)
- [GNU Fortran]ファイル(ディレクトリ)の存在を確認(2020.08.16)
- [gfortran]エラーメッセージ「Program received signal SIGSEGV: Segmentation fault - invalid memory reference.」(2020.07.20)
« [C#]文字列の一部の文字をバイト単位で抜き出す | トップページ | [C#]キャッチした例外の発生場所(ソースコードの行番号)を出力する »

コメント