2016-08-04 6 views
-4

Итак, я как бы унаследовал этот (не совсем устаревший) проект, написанный в Fortran. Чтобы сделать его потокобезопасным, мне пришлось передать указатель (так называемый user_data, вы, возможно, знаете шаблон) ко всем fortran-процедурам, чтобы они могли передать его обратно в обратные вызовы (следовательно, глобальное состояние было распределено именно в кучу).Автоматически проверять ширину столбца за пределами 72

К моему искреннему удивлению, это приводит к полному разрушению и segfaults в самых странных местах. В конце концов, я добавил только один неизменный аргумент ко всем функциям?

К моему ужасному ужасу (я не программист Фортран, просто средний хакер с умением решать проблемы), я узнал, что компилятор Fortran просто игнорирует все, что находится за пределами столбца 72, вероятно, потому, что столбцы дороги или что-то еще, без даже давая предупреждение (хорошо, за исключением некоторых случаев, когда сообщалось о «ошибке типа» (ха-ха-дисциплина в Фортране, какая шутка).

До сегодняшнего дня я продолжаю находить места в коде, которые страдают от непредвиденных последствий этого отступа.

Есть ли какой-нибудь инструмент, который может надежно проверять кодовую базу Fortran для такого рода ошибок?

И, в качестве бонусного вопроса, посвященного Джону Оливеру: почему ограничение на 72 столбца все еще есть?

+0

Anonymous downvoter: Не могли бы вы дать комментарий о том, почему этот вопрос плох? – choeger

+3

Я не спускал вниз, но был очень искушен. Не только из-за языка вашего поста, но и из-за вашего отсутствия исследований. Фиксированная форма Fortran действительно немного сложна (вот почему она была заменена бесплатной формой более 25 лет назад), но компиляторы Fortran, как правило, очень хорошо документированы. Один взгляд на руководство вашего компилятора решит вашу проблему. –

+0

BTW: Компиляторы Fortran могут очень строго соблюдать соответствие типа (и делать это, как вы заметили себя). Фактически, почти любое недавнее руководство по Fortran советует вам использовать 'implicit none', который вообще удалит любую неявную типизацию. –

ответ

5

Есть ли какой-либо инструмент, который может надежно проверять базу данных Fortran для такого рода ошибок?

Да, ваш компилятор. С gfortran это будет -Wline-truncation (включено в -Wall, то, что вы всегда должны иметь). С ifort это будет -warn truncated_source. Я бы поспорил, что (почти) у любого другого компилятора есть варианты для этого.

Предел столбца 72 вырос исторически с перфокарт и сохранялся для обратной совместимости. С большинством компиляторов вы можете изменить или даже отключить этот предел. С gfortran это было бы -ffixed-line-length-<n> с целым числом <n> и -ffixed-line-length-0, чтобы отключить его.

 Смежные вопросы

  • Нет связанных вопросов^_^