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. Ниже приведён вольный перевод.

  1. Не усложняйте программу использованием оператора goto, функциями setjump() / longjump() и рекурсией.
  2. Во всех циклах должна быть фиксированная верхняя граница.
  3. Избегайте динамического выделения памяти.
  4. Код функции должен умещаться на одной печатной странице.
  5. На каждую функцию должно приходиться минимум две assert-проверки (вход, выход).
  6. Все объекты (переменные) должны быть объявлены с минимально возможным уровнем видимости.
  7. Проверяйте возвращаемое значение функций в месте их вызова, а передаваемые параметры внутри функции.
  8. Используйте препроцессор только для простых макроопределений.
  9. Избегайте указателей на функции и ограничивайтесь одним знаком разыменования.
  10. Компилируйте со всеми ключами предупреждений; исправьте все предупреждения до релиза программы.

Изменено: