Ошибка времени выполнения Fortran «исправлена» путем записи выходных данных

#fortran

#fortran

Вопрос:

У меня возникли проблемы с некоторым старым кодом, используемым для исследований, который я хотел бы скомпилировать с помощью компилятора Intel Fortran. В конкретной подпрограмме я получаю ошибки сегментации, если я не добавлю в write инструкцию, которая просто выводит значение индекса цикла.

 do j=1,ne

SOME STUFF

write(*,*) 'j=', j

end
  

Что могло быть причиной моей ошибки, чтобы эта инструкция write исправила мою ошибку сегментации? (Примечание: j объявляется как целое число)

спасибо, Кили

Комментарии:

1. Можете ли вы сократить ее до минимального автономного примера, который все еще дает сбой? В противном случае ее будет сложно диагностировать; вероятно, где-то в «НЕКОТОРЫХ МАТЕРИАЛАХ» есть неопределенное поведение, так что ошибка segfault предотвращается каким-либо побочным эффектом записи. По сути, ваш классический «heisenbug»….

2. У меня точно такая же проблема. Я вижу, как это могло быть связано с различными оптимизациями, используемыми при компиляции. Это заставляет меня думать, что проблема с кодом все еще существует, даже если он больше не сбой.

Ответ №1:

Классические способы возникновения ошибок такого типа, которые «исправляются» путем вставки инструкций write:

  1. переход от конца массива — используйте свой компилятор, чтобы включить параметры проверки границ и отладки, чтобы проверить это;

  2. несоответствие между аргументами, предоставленными подпрограмме, и ожидаемыми аргументами. Опять же, используйте свой компилятор, если это возможно, в противном случае ваши глаза.

Шансы 5 к 1, что одна из них является причиной.

Комментарии:

1. С какой стати вставка инструкции write будет исправлять эти ошибки во время выполнения?

2. Это не так, это «исправляет» их. Важны кавычки, используемые здесь, чтобы указать, что «решение» иллюзорно. Истинной причиной ошибки, вероятно, была одна из двух рассмотренных проблем.

3. Я почувствовал, что, однако, остается вопрос, что происходит под капотом, что параметр состояния записи может вообще изменить поведение во время выполнения в таком случае (кроме записи в модуль).