1

有限要素にレガシーのFortran77コードを使用するFortranルーチンを作成しました。ただし、特定のメッシュでは、-O最適化フラグがオンになっている場合、Fortranがこれを禁止していると思われる場合でも、重要なdo-loopイテレーターが何らかの形で変更されています。-fcheck = doランタイムチェックを有効にしてgfortran4.5を使用してこのコードをコンパイルしました。これにより、上記の内容が検証されます。実行時エラーは、最適化がオンになっていて、do-iteratorを直接指している場合にのみ発生します。

最適化されたコードでgdbを使用すると(不安定に見えますが、行が前後にバウンスする)、do-iteratorが何らかの形でゼロに戻されることを明確に示しているようです。これにより、本質的に無限ループが発生します。

プロジェクト全体が同じフラグで一貫してコンパイルできることを確認したいので、このバグの原因となっているものを探して修正する方法に関する提案をいただければ幸いです。

4

1 に答える 1

4

あなたは fcheck=do; を使用すると言います。わざわざ fcheck=all を使用してみませんか? 表示されているのは、配列境界違反によるメモリ破損の典型的なケースのように聞こえますが、これは fcheck=all によってキャッチされる場合があります。配列の境界チェックがうまく機能しないのは、暗黙のインターフェイスと不適切な境界が渡された場合です。ここでの解決策は、プロシージャをモジュールに入れ、コンパイラがインターフェイスをチェックできるようにすることです。

そして、Jonathan Dursi が言ったように、valgrind のようなツールの使用を検討してください。

于 2011-04-07T19:51:20.357 に答える