Software Engineering Institute при Университете Карнеги — Меллона опубликовал SEI CERT Fortran Coding Standard — первый стандарт безопасного программирования для Fortran. Документ вышел 1 июня 2026 года и размещён в открытом репозитории SEI CERT Coding Standards на GitHub. SEI отмечает, что Fortran до сих пор используется в критически важных областях: высокопроизводительных вычислениях, численном моделировании, прогнозировании погоды и инженерных расчётах, но при этом у языка не было отдельного набора правил, ориентированного именно на безопасное программирование.
Стандарт предназначен как для новых проектов, так и для аудита старых Fortran-кодовых баз. В первой версии заявлено 25 правил, которые охватывают как общие для многих языков темы — управление памятью, ввод-вывод, корректность типов и инициализации, — так и специфичные для Fortran проблемы: неявные объявления, старые языковые конструкции, границы массивов, интерфейсы процедур, OpenMP-параллелизм и перенос данных на ускорители.
Повод для появления такого стандарта не только академический. SEI указывает, что старые Fortran-приложения всё чаще оказываются в инфраструктуре, где рядом работают AI-системы и где применяются требования к безопасной разработке, включая NIST SP 800-218 и STIG. Поэтому код, который десятилетиями считался просто «научным» или «расчётным», теперь попадает в область регулирования и проверки на соответствие требованиям безопасности.
Основные разделы стандарта
-
Типы и точность вычислений. Стандарт требует отказаться от неявной типизации, централизовать определения
kindи следить за тем, чтобы аргументы встроенных функций соответствовали ожидаемой точности. Это важно для Fortran, где ошибка в типе или точности может не проявиться сразу, но изменить результат численных расчётов. -
Объявления и инициализация. Отдельные правила требуют явно объявлять чистые процедуры и разделять объявление переменной и её инициализацию, чтобы избежать неочевидного сохранения состояния между вызовами. Для старого Fortran-кода это типичный источник трудноуловимых ошибок.
-
Неинициализированная память. В разделе выражений и присваивания выделено правило «не читать неинициализированную память». Для расчётного кода такая ошибка опасна тем, что может давать правдоподобные, но неверные результаты, а в некоторых сценариях — приводить к утечке данных из памяти процесса.
-
Массивы и границы. Стандарт запрещает выход за границы массивов, рекомендует использовать assumed-shape-массивы для dummy-аргументов, а также требует явно задавать границы при копировании данных в память устройства и проверять, что отображённые на ускоритель диапазоны действительно покрывают все используемые элементы. Это особенно важно для современных Fortran-приложений, работающих с GPU и другими ускорителями.
-
Параллельное выполнение и OpenMP. Раздел Concurrency включает правила для явного объявления атрибутов разделения данных в OpenMP, защиты переменных редукции, предотвращения гонок данных и корректного datascoping в параллельных областях. Для HPC-кода это один из самых практичных разделов стандарта.
-
Плавающая точка и порядок вычислений. В разделе Exceptions and IEEE Arithmetic пока выделено правило о необходимости явно фиксировать порядок вычислений в выражениях с плавающей точкой. Это связано с тем, что перестановка операций может менять результат из-за особенностей округления и оптимизаций компилятора.
-
Процедуры и интерфейсы. Стандарт рекомендует отключать неявное объявление процедур, избегать неявных интерфейсов через использование модульных процедур и объявлять
intentдля всех dummy-аргументов. Это повышает проверяемость кода компилятором и снижает риск ошибок при передаче аргументов. -
Область видимости и модули. В разделе Scope, Association, and Definition предлагается ограничивать область видимости переменных и процедур, импортировать из модулей только нужные сущности через
ONLY, а старыеCOMMON-блоки заменять модулями для более безопасной инкапсуляции данных. -
Отказ от устаревших и неопределённых конструкций. В разделе Miscellaneous собраны рекомендации не использовать устаревшие конструкции Fortran, не полагаться на расширения конкретного компилятора и не зависеть от неопределённого поведения. Это должно повысить переносимость и предсказуемость старых кодовых баз.
Состояние проекта
SEI прямо подчёркивает, что опубликованный Fortran-стандарт пока является work in progress: часть страниц может быть неполной или содержать ошибки, а сами правила и рекомендации должны дорабатываться сообществом. Разработчикам предлагают открывать GitHub issues, форкать репозиторий и отправлять pull request’ы.
В общем, SEI CERT Fortran Coding Standard пытается закрыть дыру между современными требованиями к безопасной разработке и огромным пластом старого научного, оборонного и инженерного кода, который всё ещё активно используется, но часто написан в стиле, нормальном для прошлого века и опасном для современных сред эксплуатации.
Перемещено dataman из doc



