私は研究者がFortranプログラムをデバッグするのを少し助けたいと思っています。デモンストレーションの目的で、意図的にがsegfaultを引き起こすプログラムを作成しました。ここで最適化レベルが低くなるとSEGFAULTが消えますか?
はソースです:
program segfault
implicit none
integer :: n(10), i
integer :: ios, u
open(newunit=u, file='data.txt', status='old', action='read', iostat=ios)
if (ios /= 0) STOP "error opening file"
i = 0
do
i = i + 1
read(u, *, iostat=ios) n(i)
if (ios /= 0) exit
end do
close(u)
print*, sum(n)
end program segfault
data.txt
ファイルは100個のランダムな数字が含まれています
for i in {1..100}; do
echo $RANDOM >> data.txt;
done
私は
gfortran -O3 -o segfault.exe segfault.f90
でこのプログラムをコンパイルするときに生成される実行可能ファイルは、律儀にクラッシュします。しかし、デバッグを有効にしてコンパイルすると:
gfortran -O0 -g -o segfault.exe segfault.f90
次に、最初の10個の値だけが読み込まれ、合計が出力されます。価値のあるものについては、-O2
は希望のsegfaultを引き起こします。-O1
はそうしません。
私はこれについて深く知っています。結局のところ、デバッグシンボルを有効にしてコンパイルしたときにバグがなくなると、どうすれば正しくデバッグできますか?
誰かがこの現象を説明できますか?私はGNU Fortran (MacPorts gcc5 5.3.0_1) 5.3.0