FORTRAN 77数组越界是否会修改程序自身导致DO循环无限运行?
Fortran数组越界导致DO循环无限运行问题解答
问题背景
用户提供的测试F77代码如下:
dimension totlev(20) do 100 i=1,24 totlev(i)=0.0 write(0,*) 'totlev i=',i, totlev(i) 100 continue end
使用MinGW环境执行gfortran test.f编译时触发数组越界警告,运行生成的可执行文件出现无限循环现象。
核心疑问解答
为什么固定次数的DO循环会无限运行?
Fortran 77标准默认不开启运行时数组越界检查,本案例中totlev数组与循环变量i均分配在程序栈空间内,且i的内存地址恰好位于totlev数组的高地址侧。totlev的有效下标仅为1~20,当循环执行到i=21时,totlev(21)的访问实际指向了存储循环变量i的内存地址,执行赋值语句totlev(i)=0.0会直接将i的值改写为0。后续循环计数每次将i自增1,到21就会被再次改回0,永远无法达到循环终止阈值24,因此出现无限循环。是否是越界修改了程序代码段导致该问题?
该可能性不存在。Windows 7用户态的程序代码段默认被标记为只读权限,若程序尝试写入代码段内存,会直接触发访问违例报错崩溃,不会出现无限循环的表现。
问题规避建议
- 编译gfortran代码时添加
-fcheck=bounds参数,开启运行时数组越界检查,出现越界操作时程序会直接报错终止,方便快速定位问题。 - 尽量使用更高版本的Fortran标准编写代码,显式声明数组的上下界与变量类型,避免隐式声明带来的潜在隐患。
内容的提问来源于stack exchange,提问作者Some Student
相关产品推荐
相关产品推荐

