MISRA C и Сила Десяти Правил
Кроме руководств по оформлению кода, существуют своды правил — что делать можно, а чего делать нельзя. Несмотря на то, что язык Си довольно простой с синтаксической точки зрения, он при этом довольно гибкий, и часть его возможностей приводит к неопределённому поведению: деление на ноль, выход за пределы массива и т.д. В критически важных системах это недопустимо. В 1998 году организация MISRA (сокр. Motor Industry Software Reliability Association) выпустила первый документ, регламентирующий написание кода для автомобильной промышленности. Со временем стандарт был обновлён несколько раз (2004, 2012), и количество правил значительно увеличилось; MISRA C 2012 содержит 143 правила, сгруппированных по секциям — обязательные, требуемые и рекомендуемые.
К сожалению, документ MISRA C распространяется за деньги, и обсудить его здесь не получится. Однако есть более короткий список, который на самом деле является дополнением к MISRA. Его составил в 2006 году сотрудник НАСА Геральд Хольцман (Gerard J. Holzmann). Список находится в открытом доступе и приведён на странице в англоязычной Википедии — The Power of 10: Rules for Developing Safety-Critical Code. Ниже приведён вольный перевод.
- Не усложняйте программу использованием оператора
goto
, функциямиsetjump()
/longjump()
и рекурсией. - Во всех циклах должна быть фиксированная верхняя граница.
- Избегайте динамического выделения памяти.
- Код функции должен умещаться на одной печатной странице.
- На каждую функцию должно приходиться минимум две
assert
-проверки (вход, выход). - Все объекты (переменные) должны быть объявлены с минимально возможным уровнем видимости.
- Проверяйте возвращаемое значение функций в месте их вызова, а передаваемые параметры внутри функции.
- Используйте препроцессор только для простых макроопределений.
- Избегайте указателей на функции и ограничивайтесь одним знаком разыменования.
- Компилируйте со всеми ключами предупреждений; исправьте все предупреждения до релиза программы.