ПРОГРАММИРОВАНИЕ

10 правил NASA для написания критически важного кода

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

1

Ограничьте весь код очень простыми функциями управления потоком выполнения — не используйте операторы goto, setjmp или longjmp, а также прямую или косвенную рекурсию.

2

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

3

Не используйте динамическое выделение памяти после инициализации.

4

Ни одна функция не должна быть длиннее, чем та, которая может быть напечатана на одном листе бумаги в стандартном формате с одной строкой на выражение и одной строкой на объявление. Как правило, это означает не более 60 строк кода на функцию.

5

В функции должно быть не более двух ассертов. Такие ассерты (защиты) используются для проверки аномальных условий, которые никогда не должны возникать в реальных условиях. Ассерты не должны содержать побочных эффектов и должны быть определены как булевы тесты. Когда ассерт не выполняется, должно быть предпринято явное действие по восстановлению, например, путем возврата ошибки вызывающей стороне. Любая защита, для которой инструмент статической проверки может доказать, что она никогда не нарушается  или наоборот нарушается всегда, нарушает это правило (т.е. невозможно выполнить правило, добавив бесполезные выражения «assert (true)»).

6

Объекты данных должны быть объявлены с минимально возможным уровнем области видимости.

7

Возвращаемое значение не пустых функций должно проверяться каждой вызывающей функцией, а валидность параметров должна проверяться внутри каждой функции.

8

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

9

Использование указателей должно быть ограничено. В частности, допускается не более одного уровня разыменования. Операции разыменования указателя не могут быть скрыты в определениях макросов или внутри объявлений typedef. Указатели на функции не допускаются.

10

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