Оптимизация gfortran вызывает ошибку цикла do-variable в fortran во время выполнения - PullRequest
1 голос
/ 07 апреля 2011

Я написал подпрограмму на фортране, которая использует какой-то устаревший код фортран 77 для конечных элементов.Тем не менее, с конкретной сеткой, когда флаг оптимизации -O включен, важный итератор цикла do-каким-то образом модифицируется, даже если Fortran предположительно это запрещает.Я скомпилировал этот код, используя gfortran4.5 с включенной проверкой -fcheck = do run-time, и он проверяет то, что я заметил выше.Ошибка во время выполнения возникает, только когда оптимизация включена и указывает непосредственно на итератор do.

Использование gdb в оптимизированном коде кажется (хотя и кажется ошибочным - строки, подпрыгивающие взад и вперед), явно указывает на то, чтоdo-iterator каким-то образом обнуляется, и, по сути, это вызывает хороший бесконечный цикл.

Любые предложения о том, как выследить и исправить то, что вызывает эту ошибку, были бы очень благодарны, как я хотел бычтобы весь проект можно было последовательно компилировать с одинаковыми флагами.

1 Ответ

4 голосов
/ 07 апреля 2011

Вы говорите, что используете fcheck = do; почему бы не пройти весь путь и использовать fcheck = all? То, что вы видите, звучит как типичный случай повреждения памяти из-за нарушения границ массива, которое fcheck = all может в некоторых случаях поймать. Где проверка границ массива работает не так хорошо, это с неявными интерфейсами и передачей неправильных границ; решение здесь состоит в том, чтобы поместить ваши процедуры в модули, что позволяет компилятору проверять интерфейсы.

И, как сказал Джонатан Дурси, рассмотрите возможность использования такого инструмента, как valgrind.

...