我编写了一个 fortran 例程,它使用一些旧版 fortran 77 代码来表示有限元。但是,对于特定的网格,当 -O 优化标志打开时,一个重要的 do-loop 迭代器会以某种方式被修改,即使 fortran 应该禁止这样做。我已经使用 gfortran4.5 编译了这段代码,并启用了 -fcheck=do 运行时检查,它验证了我上面提到的内容。仅当打开优化并直接指向 do-iterator 时才会发生运行时错误。
在优化代码上使用 gdb 似乎(虽然看起来不稳定 - 行来回弹跳)似乎清楚地表明 do-iterator 以某种方式被设置回零,并且本质上这会导致一个很好的无限循环。
任何关于如何寻找和修复导致此错误的任何建议都将不胜感激,因为我想确保整个项目可以使用相同的标志进行一致的编译。