1

我编写了一个 fortran 例程,它使用一些旧版 fortran 77 代码来表示有限元。但是,对于特定的网格,当 -O 优化标志打开时,一个重要的 do-loop 迭代器会以某种方式被修改,即使 fortran 应该禁止这样做。我已经使用 gfortran4.5 编译了这段代码,并启用了 -fcheck=do 运行时检查,它验证了我上面提到的内容。仅当打开优化并直接指向 do-iterator 时才会发生运行时错误。

在优化代码上使用 gdb 似乎(虽然看起来不稳定 - 行来回弹跳)似乎清楚地表明 do-iterator 以某种方式被设置回零,并且本质上这会导致一个很好的无限循环。

任何关于如何寻找和修复导致此错误的任何建议都将不胜感激,因为我想确保整个项目可以使用相同的标志进行一致的编译。

4

1 回答 1

4

你说你使用 fcheck=do; 为什么不一直使用 fcheck=all 呢?您所看到的听起来像是由于违反数组边界而导致的内存损坏的典型案例, fcheck=all 在某些情况下可以捕获。数组边界检查不能很好地工作的地方是隐式接口和传递的边界不正确;这里的一个解决方案是将您的过程放入模块中,允许编译器检查接口。

而且,就像 Jonathan Dursi 所说,考虑使用像 valgrind 这样的工具。

于 2011-04-07T19:51:20.357 回答