Зачем нужен MISRA C — стандарт с огромным количеством запретов
Рассказываем, что такое стандарт MISRA для кода на С и С++, почему в MISRA описана сотня запретов и как применять стандарт в разработке ПО.
4К открытий10К показов
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и в автомобильном ПО.
Помимо общих правил вроде оформления кода, первый стандарт включал в себя:
- Правила для управления типами данных, которые запрещали преобразование типов.
- Рекомендации для обработки исключительных ситуаций (exceptions). Рекомендации по использованию операторов try-catch, исключений и т.д.
- Запрет непортативных (non-portable) функций и конструкций, которые могут привести к неправильному поведению или ошибкам при переносе кода на другие платформы или компиляторы.
- Рекомендации и требования к валидации кода и процессу разработки.
В последующие годы стандарт обновлялся и дополнялся. В 2004 году был выпущен стандарт “MISRA C:2004”, а в 2012 году – стандарт “MISRA C:2012”.
В 2023 году стандарт снова обновился, но изучить его на официальном сайте пользователи из России могут только с использованием VPN.
Где используется MISRA
Сегодня стандарт используют почти во всём транспорте — в автомобильной и авиационной отраслях —, в медицине и промышленности. Вот несколько компаний, которые применяют MISRA в разработке ПО:
- Автомобильная промышленность: BMW, Ford, General Motors, Honda, Toyota и Volkswagen.
- Авиационная промышленность: Airbus и Boeing.
- Медицинская техника: Siemens Healthineers, Philips Healthcare и Medtronic.
- Промышленные системы: Schneider Electric и Rockwell Automation.
Что запрещено в MISRA
Вот несколько примеров того, что запрещено в стандарте MISRA:
- Фрагменты кода не должны быть закомментированы.
- Базовые типы char, int, short, long, float и double не должны использоваться.
- Операнды логических операторов && или || должны быть первичными выражениями.
- Оператор goto не должен использоваться.
- Заголовочный файл
и функция setlocale не должны использоваться.
К примеру, вместо char, int, short, long, float и double нужно использовать директиву typedef.
Неправильный код:
Правильный код:
Операнды &&
и ||
должны быть одиночными переменными, константами или выражениями в скобках.
Неправильный код:
Правильный код:
С полным списком правил на русском языке можно ознакомиться по этой ссылке.
Как проверять код на соответствие MISRA
На рынке есть несколько анализаторов кода, которые проверяют соответствие стандарту MISRA.
- PC-lint/FlexeLint — один из самых популярных инструментов статического анализа для языка C и C++. PC-lint/FlexeLint поддерживает проверку соответствия нескольким версиям стандарта MISRA C, включая MISRA C:1999, MISRA C:2004 и MISRA C:2012.
- Polyspace — анализатор от MathWorks также поддерживает проверку соответствия стандарту MISRA C. Он помогает отслеживать проблемы вроде неопределенного поведения или использования небезопасных функций.
- Klocwork — ещё один популярный инструмент статического анализа, который поддерживает проверку соответствия стандарту MISRA C.
- Cppcheck — бесплатный и открытый инструмент статического анализа для C и C++. Изначально он не настроен на проверку соответствия стандарту MISRA, но Cppcheck помогает обнаружить некоторые нарушения.
Также есть пара компиляторов.
- IAR Embedded Workbench — один из наиболее известных компиляторов, который предоставляет мощный статический анализатор для поиска нарушения правил MISRA и предлагает решения для их исправления.
- MULTI IDE — интегрированная среда разработки (IDE) с компилятором, поддерживающим стандарт MISRA C. MULTI IDE включает в себя инструменты статического анализа, покрывающие правила MISRA и помогающие в обнаружении потенциальных ошибок.
Заключение
В заключение, стандарт MISRA C — важный инструмент для повышения качества и безопасности кода, который включает рекомендации и правила для написания надежного и поддерживаемого ПО.
Но стоит отметить, что соблюдение стандарта не всегда обязательно и зависит от требований проекта. Некоторые компании выбирают свой набор правил, адаптированных под их цели и реалии разработки.
Соблюдение стандарта MISRA C — это только один из инструментов при разработке безопасного ПО. Он должен быть использован вместе с другими методологиями и практиками вроде тестирования или обзора кода.
Надеюсь, статья оказалась интересной и полезной. Если вы работаете, к примеру, в разработке ПО для автомобилей, расскажите в комментариях, используете ли вы MISRA в работе. Может быть, есть и другие стандарты, которые на практике популярнее MISRA?
4К открытий10К показов