Написать пост

Зачем нужен MISRA C — стандарт с огромным количеством запретов

Аватарка пользователя sudo >: )

Рассказываем, что такое стандарт MISRA для кода на С и С++, почему в MISRA описана сотня запретов и как применять стандарт в разработке ПО.

MISRA C – это набор промышленных рекомендаций и стандартов, разработанных ассоциацией MISRA (Motor Industry Software Reliability Association) для разработки программного обеспечения на языке Си.

Стандарт был создан для того, чтобы повысить безопасность и надёжность кода в том случае, когда от его качества зависит жизнь человека. К примеру, MISRA используют в автомобильной отрасли.

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

Конечно, эти примеры — донельзя утрированные, но столкнуться с ними в реальной жизни не хотелось бы никому. Именно жёсткий стандарт MISRA позволяет исключить возможность ошибки, которая может стоить жизни.

MISRA C определяет правила, которым разработчикам следует следовать при написании кода. Каждый год количество правил, по своей сути — запретов, только растёт:

  • В MISRA-C:1998 указаны 127 правил: 93 обязательных и 34 рекомендательных.
  • В MISRA-C:2004 указано 141 правило: 121 обязательное и 20 рекомендательных.
  • В MISRA-C:2012 указаны 143 правила и 16 директив. 

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

Как появился MISRA

Стандарт MISRA был разработан ассоциацией MISRA (Motor Industry Software Reliability Association) в 1994 году в Великобритании. Изначальная цель стандарта — повысить безопасность и надежность ПО для автомобилей.

В начале 1990-х годов количество электроники в автомобилях неуклонно росло. Стало очевидно, что некачественный код может быть опасен для пассажира: к примеру, ошибка ПО во время движения может стоить водителю жизни. Чтобы обезопасить пассажиров, и была создана ассоциация MISRA.

Первый выпущенный стандарт назывался “MISRA Guidelines for the Use of C in Vehicle-Based Software”. Его опубликовали в 1994 году. Он определил правила для использования языка Cи в автомобильном ПО.

Помимо общих правил вроде оформления кода, первый стандарт включал в себя:

  1. Правила для управления типами данных, которые запрещали преобразование типов.
  2. Рекомендации для обработки исключительных ситуаций (exceptions). Рекомендации по использованию операторов try-catch, исключений и т.д.
  3. Запрет непортативных (non-portable) функций и конструкций, которые могут привести к неправильному поведению или ошибкам при переносе кода на другие платформы или компиляторы.
  4. Рекомендации и требования к валидации кода и процессу разработки.

В последующие годы стандарт обновлялся и дополнялся. В 2004 году был выпущен стандарт “MISRA C:2004”, а в 2012 году – стандарт “MISRA C:2012”.

В 2023 году стандарт снова обновился, но изучить его на официальном сайте пользователи из России могут только с использованием VPN.

Где используется MISRA

Сегодня стандарт используют почти во всём транспорте — в автомобильной и авиационной отраслях —, в медицине и промышленности. Вот несколько компаний, которые применяют MISRA в разработке ПО:

  1. Автомобильная промышленность: BMW, Ford, General Motors, Honda, Toyota и Volkswagen.
  2. Авиационная промышленность: Airbus и Boeing.
  3. Медицинская техника: Siemens Healthineers, Philips Healthcare и Medtronic.
  4. Промышленные системы: Schneider Electric и Rockwell Automation.

Что запрещено в MISRA

Вот несколько примеров того, что запрещено в стандарте MISRA:

  1. Фрагменты кода не должны быть закомментированы.
  2. Базовые типы char, int, short, long, float и double не должны использоваться. 
  3. Операнды логических операторов && или || должны быть первичными выражениями.
  4. Оператор goto не должен использоваться.
  5. Заголовочный файл и функция setlocale не должны использоваться.

К примеру, вместо char, int, short, long, float и double нужно использовать директиву typedef.

Неправильный код:

			int x;
		

Правильный код:

			typedef int SI_16
SI_16 x;
		

Операнды && и || должны быть одиночными переменными, константами или выражениями в скобках.

Неправильный код:

			a && b || c
a || b && c
a == 3 || b > 5
		

Правильный код:

			a && b && c
a || b || c
(a == 3) || (b > 5)
		

С полным списком правил на русском языке можно ознакомиться по этой ссылке.

Как проверять код на соответствие MISRA

На рынке есть несколько анализаторов кода, которые проверяют соответствие стандарту MISRA.

  1. PC-lint/FlexeLint — один из самых популярных инструментов статического анализа для языка C и C++. PC-lint/FlexeLint поддерживает проверку соответствия нескольким версиям стандарта MISRA C, включая MISRA C:1999, MISRA C:2004 и MISRA C:2012.
  2. Polyspace — анализатор от MathWorks также поддерживает проверку соответствия стандарту MISRA C. Он помогает отслеживать проблемы вроде неопределенного поведения или использования небезопасных функций.
  3. Klocwork — ещё один популярный инструмент статического анализа, который поддерживает проверку соответствия стандарту MISRA C.
  4. Cppcheck — бесплатный и открытый инструмент статического анализа для C и C++. Изначально он не настроен на проверку соответствия стандарту MISRA, но Cppcheck помогает обнаружить некоторые нарушения.

Также есть пара компиляторов.

  1. IAR Embedded Workbench — один из наиболее известных компиляторов, который предоставляет мощный статический анализатор для поиска нарушения правил MISRA и предлагает решения для их исправления.
  2. MULTI IDE — интегрированная среда разработки (IDE) с компилятором, поддерживающим стандарт MISRA C. MULTI IDE включает в себя инструменты статического анализа, покрывающие правила MISRA и помогающие в обнаружении потенциальных ошибок.

Заключение

В заключение, стандарт MISRA C — важный инструмент для повышения качества и безопасности кода, который включает рекомендации и правила для написания надежного и поддерживаемого ПО.

Но стоит отметить, что соблюдение стандарта не всегда обязательно и зависит от требований проекта. Некоторые компании выбирают свой набор правил, адаптированных под их цели и реалии разработки.

Соблюдение стандарта MISRA C — это только один из инструментов при разработке безопасного ПО. Он должен быть использован вместе с другими методологиями и практиками вроде тестирования или обзора кода.

Надеюсь, статья оказалась интересной и полезной. Если вы работаете, к примеру, в разработке ПО для автомобилей, расскажите в комментариях, используете ли вы MISRA в работе. Может быть, есть и другие стандарты, которые на практике популярнее MISRA?

Следите за новыми постами
Следите за новыми постами по любимым темам
4К открытий5К показов