10 правила, които позволяват на НАСА да пише милиони редове код с минималнигрешки - Форум на
Много любезен разработчик
Лабораторията за реактивни двигатели е изследователският център на НАСА, отговорен за повечето безпилотни космически кораби в Съединените щати. Те пишат много код там и имат много по-малко място за грешка от обикновените програмисти.
Благодаря на Habrauser Boletus за важната корекция и допълнение:През 2006 г. Джерард Холцман и неговият екип формулираха 10 основни правила за JPL в документа „Силата на 10: Правила за разработване на критичен за безопасността код“. Те формират основата на настоящия стандарт, заедно с MISRA C и други допълнения. Статия в Уикипедия.
Ето превод на този списък.
-
Клоните и условията трябва да бъдат строго ограничени. Не използвайте goto, setjmp или longjmp, не използвайте директна или непряка рекурсия.
Всички цикли трябва да имат ограничение. Програмата за проверка трябва да може лесно да докаже, че определен брой итерации не могат да бъдат надвишени. Ако границата не може да бъде доказана статично, тогава правилото се счита за нарушено.
Не използвайте динамично разпределение на паметта след инициализация.
Всяка функция трябва да се побира на един стандартен лист хартия, един израз на ред и един ред на дефиниция. Това обикновено означава, че функцията не трябва да е по-дълга от 60 реда.
Не трябва да има повече от две твърдения за функция. Утвържденията се използват за тестване за аномални условия, които не могат да възникнат при реално изпълнение. Утвържденията не трябва да съдържат странични ефекти и трябва да са булеви тестове във формат.Когато дадено твърдение е неуспешно, трябва да се задейства специално действие за възстановяване, като например връщане на състоянието на срив обратно към извикващата функция. Ако проверяващият докаже, че твърдението никога не се проваля или никога не е удовлетворено, тогава правилото се счита за нарушено. (Не можете да заобиколите това правило с безсмислено „assert(true)“).
Обектите с данни трябва да бъдат декларирани на най-ниското (възможно) ниво на обхват.
Върнатата стойност на функция, която не е void, трябва да бъде проверена от извикващата функция. Валидността на параметрите трябва да се проверява във всяка функция.
Препроцесорът може да се използва само за включване на заглавни файлове и прости дефиниции на макроси. Поставянето на токени, променливите функции и рекурсивните макро извиквания са забранени. Използването на директиви за условно компилиране е нежелателно, но понякога неизбежно. Това означава, че рядко е подходящо да се използват повече от едно или две условия в директивите за компилиране, дори в големи проекти.
Използването на указатели трябва да бъде ограничено. Не се допуска повече от едно ниво на дереференция. Операторите за дерефериране не трябва да бъдат скрити в дефинициите на макроси или вътре в typedef. Функционалните указатели не са разрешени.