Открыть сервис

MISRA C

MISRA C — это набор руководящих принципов (стандартов) разработки программного обеспечения на языке C, предназначенный для повышения безопасности, надёжности и переносимости кода, особенно в критически важных системах. Стандарт разработан и поддерживается консорциумом MISRA (Motor Industry Software Reliability Association), первоначально созданным в Великобритании в 1990-х годах. Основная цель MISRA C — минимизировать риск возникновения ошибок, связанных с неопределённым поведением, побочными эффектами и сложностью языка C, что делает его обязательным или рекомендуемым стандартом в таких отраслях, как автомобилестроение, авиакосмическая промышленность, медицинское оборудование, железнодорожный транспорт и промышленная автоматизация.

История

Консорциум MISRA был основан в 1990 году как совместный проект британских автопроизводителей (включая Rover, Jaguar, Lucas и других) для решения проблем, связанных с использованием программируемых электронных систем в автомобилях. Первая версия руководства MISRA C, известная как MISRA C:1998, была опубликована в 1998 году. Она содержала 127 правил, направленных на ограничение использования потенциально опасных конструкций языка C. Этот стандарт быстро получил признание за пределами автомобильной промышленности, став де-факто стандартом для встраиваемых систем в других критических областях.

В 2004 году вышла вторая редакция — MISRA C:2004, которая расширила набор правил до 141, охватив больше аспектов языка, включая работу с динамической памятью, прерываниями и многопоточностью. В 2008 году было выпущено дополнение MISRA C:2008 Amendment 1, добавившее правила для языка C99 (стандарт ISO/IEC 9899:1999). Наиболее значительным обновлением стала версия MISRA C:2012, опубликованная в марте 2013 года. Она полностью переработала структуру правил, введя три уровня строгости (обязательные, рекомендуемые и директивы), и адаптировала стандарт под C99 и C11. В 2019 году вышло дополнение MISRA C:2012 Amendment 2, добавившее поддержку C11 и C18, а также новые правила для безопасности (security). Последняя на 2024 год версия — MISRA C:2023, опубликованная в декабре 2022 года, которая объединила все предыдущие изменения и добавила поддержку C17 и C23.

Структура стандарта

MISRA C:2012 (и последующие версии) состоит из двух основных типов требований: правил (rules) и директив (directives). Правила — это формальные, проверяемые автоматически или вручную утверждения, которые должны быть выполнены. Директивы — это более общие рекомендации, требующие интерпретации и проектных решений.

Классификация правил

Все правила и директивы классифицируются по степени строгости:

  • Обязательные (Mandatory): Нарушение недопустимо. Код, нарушающий обязательное правило, считается некорректным и неприемлемым для систем, требующих сертификации.
  • Рекомендуемые (Required): Нарушение должно быть обосновано и документировано в отчёте об отступлении (deviation report). Процедура отклонения требует формального утверждения.
  • Рекомендательные (Advisory): Нарушение не считается ошибкой, но его следует избегать, если это возможно. Следование этим правилам повышает качество кода, но не является обязательным для сертификации.

Категории правил

Правила также сгруппированы по тематическим категориям, охватывающим различные аспекты языка C:

КатегорияОписаниеПримеры правил
Окружение (Environment)Взаимодействие с транслятором и средой выполнения.Правило 1.1: Программа не должна содержать нарушений стандарта C.
Стандарт C (C Standard)Ограничения на использование неопределённого, неуточнённого и определяемого реализацией поведения.Правило 1.3: Не должно быть случаев неопределённого поведения.
Комментарии и документированиеТребования к оформлению кода и пояснениям.Правило 3.1: Комментарии не должны содержать символов, которые могут быть интерпретированы как код.
Типы данных (Types)Ограничения на использование целочисленных типов, плавающей точки, перечислений.Правило 10.1: Операнды в арифметических операциях должны иметь одинаковый базовый тип.
Объявления и определенияТребования к объявлению переменных, функций и типов.Правило 8.2: Функции должны быть объявлены с прототипами.
ИнициализацияПравила корректной инициализации переменных.Правило 9.1: Все автоматические переменные должны быть инициализированы перед использованием.
Выражения (Expressions)Ограничения на порядок вычислений, побочные эффекты, неявные преобразования.Правило 12.1: Оператор присваивания не должен использоваться в выражении, где не ожидается результат присваивания.
Управляющие конструкцииОграничения на использование if, switch, циклов, goto.Правило 15.1: В операторе switch должна быть метка default.
ФункцииТребования к параметрам, возвращаемым значениям, рекурсии.Правило 17.1: Функция не должна вызывать себя (рекурсия запрещена).
Указатели и массивыОграничения на арифметику указателей, приведение типов, использование массивов.Правило 18.1: Указатель не должен быть приведён к целочисленному типу.
ПрепроцессорОграничения на использование макросов, #include, #define.Правило 20.2: Макросы не должны использоваться для определения констант, если можно использовать enum или const.

Применение и значение

MISRA C является одним из наиболее широко используемых стандартов кодирования для встраиваемых систем. Его применение обязательно или настоятельно рекомендуется в следующих отраслях:

  • Автомобильная промышленность: Стандарт ISO 26262 (функциональная безопасность дорожных транспортных средств) прямо ссылается на MISRA C как на один из методов достижения целей безопасности. Практически все автомобильные электронные блоки управления (ECU) разрабатываются с соблюдением MISRA C.
  • Авиакосмическая промышленность: Стандарт DO-178C (разработка программного обеспечения для бортовых систем) не требует MISRA C напрямую, но его применение считается передовой практикой для достижения высокого уровня целостности (Level A/B).
  • Медицинское оборудование: Стандарт IEC 62304 (программное обеспечение медицинских устройств) рекомендует использование статического анализа и стандартов кодирования, таких как MISRA C, для снижения рисков.
  • Железнодорожный транспорт: Стандарт EN 50128 (программное обеспечение для железнодорожных систем управления и защиты) рекомендует MISRA C для обеспечения безопасности.
  • Промышленная автоматизация: Стандарт IEC 61508 (функциональная безопасность электрических/электронных/программируемых электронных систем) также рекомендует использование MISRA C.

Инструменты статического анализа

Для автоматической проверки соответствия кода MISRA C используются инструменты статического анализа кода. Они анализируют исходный код без его выполнения и выявляют нарушения правил. Наиболее популярные инструменты, поддерживающие MISRA C:

  • PC-lint / PC-lint Plus (Gimpel Software)
  • QAC / QAC++ (QA Systems)
  • Cppcheck (с расширениями)
  • Clang Static Analyzer (с опцией -analyzer-checker=misra)
  • Coverity (Synopsys)
  • Helix QAC (Perforce)
  • LDRA Testbed (LDRA)

Критика и ограничения

Несмотря на широкое признание, MISRA C подвергается критике по нескольким направлениям:

  • Сложность и объём: Стандарт содержит сотни правил, что делает его внедрение трудоёмким и дорогим. Особенно сложно адаптировать существующий код.
  • Чрезмерная строгость: Некоторые правила (например, запрет на рекурсию, запрет на динамическое выделение памяти) могут быть неоправданно строгими для определённых приложений, где эти конструкции безопасны и эффективны.
  • Субъективность директив: Директивы, в отличие от правил, требуют интерпретации, что может приводить к разным трактовкам и спорам между разработчиками и аудиторами.
  • Фокус на безопасность, а не на защиту: Изначально MISRA C был ориентирован на функциональную безопасность (safety), а не на информационную безопасность (security). В версии 2012 года были добавлены правила для защиты, но критики утверждают, что их недостаточно для современных угроз.
  • Отсутствие поддержки современных идиом C: Некоторые правила могут конфликтовать с современными практиками программирования на C, например, с использованием constexpr или атомарных операций, что требует написания громоздкого кода.

Интересные факты

  • Название MISRA расшифровывается как Motor Industry Software Reliability Association, хотя сейчас организация занимается не только автомобильной, но и другими отраслями.
  • Существует также стандарт MISRA C++, основанный на тех же принципах, но адаптированный для языка C++ (MISRA C++:2008 и последующие версии).
  • Соблюдение MISRA C часто является одним из условий для получения сертификата функциональной безопасности (например, ISO 26262 ASIL D).
  • В России MISRA C активно используется в компаниях, разрабатывающих встраиваемое ПО для оборонной, авиационной и автомобильной промышленности, хотя обязательных требований на уровне государственных стандартов нет.

Источники

  1. MISRA C:2012 — Guidelines for the use of the C language in critical systems. MISRA Consortium, 2013.
  2. MISRA C:2023 — Guidelines for the use of the C language in critical systems. MISRA Consortium, 2022.
  3. ISO 26262:2018 — Road vehicles — Functional safety.
  4. DO-178C — Software Considerations in Airborne Systems and Equipment Certification.
  5. IEC 62304:2006 — Medical device software — Software life cycle processes.
  6. IEC 61508:2010 — Functional safety of electrical/electronic/programmable electronic safety-related systems.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →