﻿# PVS\-Studio: поддержка стандартов кодирования MISRA C и MISRA C\+\+

Начиная с версии 6\.27 статический анализатор кода PVS\-Studio может классифицировать свои предупреждения согласно стандартам MISRA C и MISRA C\+\+\. Благодаря поддержке этих стандартов анализатор стало возможным эффективно использовать для улучшения безопасности, переносимости и надежности программ для встраиваемых систем\.

![0596_PVS_Studio_MISRA_ru/image1.png](https://import.viva64.com/docx/blog/0596_PVS_Studio_MISRA_ru/image1.png)



**Update\.** На сайте появился раздел "[Классификация предупреждений PVS\-Studio согласно стандартам: MISRA C, MISRA C\+\+](https://pvs-studio.ru/ru/pvs-studio/sast/misra/)"\. В нём приводится таблица соотвествия между диагностиками PVS\-Studio и правилами, описанными в MISRA C:2012 и MISRA C\+\+:2008\.

В этом году мы занялись поддержкой в анализаторе [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/) таких стандартов, как [CWE](https://cwe.mitre.org/) и [SEI CERT](https://wiki.sei.cmu.edu/confluence/display/seccode/SEI+CERT+Coding+Standards)\. В основном поддержка свелась к классификации уже реализованных в анализаторе диагностик согласно этим стандартам\. Дополнительно было реализовано несколько новых или расширено несколько старых диагностик, чтобы более полно соответствовать этим стандартам\.

Таблицы соответствий [диагностик](https://pvs-studio.ru/ru/docs/warnings/) PVS\-Studio различным стандартам:

* [Соответствие CWE](https://pvs-studio.ru/ru/pvs-studio/sast/cwe/)
* [Соответствие SEI CERT](https://pvs-studio.ru/ru/pvs-studio/sast/cert/)

Теперь настало время стандартов MISRA C и MISRA C\+\+\. Это стандарты разработки программного обеспечения на языке C и C\+\+, созданные организацией [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\)\. Цель стандартов \- улучшить безопасность, переносимость и надежность программ для встраиваемых систем\. Текст стандартов является платным\.

Мы считаем сильной стороной нашего анализатора возможность взять и начать использовать его в уже существующем большом проекте\. Можно запустить PVS\-Studio на кодовой базе, выявить старые ошибки и затем использовать анализатор регулярно, чтобы находить новые дефекты как можно раньше\.

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

Мы решили, что PVS\-Studio будет анализатором, который ищет именно ошибки\. Это его конкурентное преимущество\. Программист может запустить его на большой кодовой базе и быть уверен, что его не завалит невероятным количеством сообщений про оформление кода и он сможет сосредоточиться именно на багах\.

Поэтому мы изначально [критически относились](https://pvs-studio.ru/ru/blog/posts/0436/) к стандартам MISRA и долгое время не планировали их реализовывать\. Стандарты MISRA предназначены для упрощения и улучшения качества кода в целом, что помогает предотвращать ошибки\. То есть в нем как раз большинство диагностик относится к стилю написания кода\. Лучше всего это пояснить на примере\.

В стандарте MISRA есть правило, согласно которому тела операторов _if_ должны быть заключены в фигурные скоки\. В MISRA C это правило 15\.6, а в MISRA C\+\+ это 6\-4\-1\. Пример неправильного кода:

```cpp
if (i == bestOffs) continue;
```

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

```cpp
if (i == bestOffs)
{
  continue;
}
```

Подобные диагностики невозможно применять к уже существующим проектам, написанным для работы под управлением операционной системы Winodws, Linux или macOS\. Например, одно только описанное правило про фигурные скобки даёт **1947** срабатываний диагностики [V2507](https://pvs-studio.ru/ru/docs/warnings/v2507/) \(MISRA C 15\.6, MISRA C\+\+ 6\-4\-1\) для проекта WinMerge\. А ведь WinMerge \- это маленький проект\! Всего около 250 000 строк кода на языке C и C\+\+\.

До 2018 года анализатор PVS\-Studio был ориентирован на проверку десктопных приложений, работающих под управлением Windows, Linux и macOS\. Соответственно, поддержка MISRA имела мало практического смысла\. Никто не будет внедрять в большой существующий десктопный проект этот стандарт\.

Всё изменилось, когда в 2018 году мы начали поддержку встраиваемых систем\. В этом году в анализаторе были поддержаны:

* Windows\. IAR Embedded Workbench, C/C\+\+ Compiler for ARM C, C\+\+
* Windows/Linux\. Keil µVision, DS\-MDK, ARM Compiler 5/6 C, C\+\+
* Windows/Linux\. Texas Instruments Code Composer Studio, ARM Code Generation Tools C, C\+\+
* Windows/Linux/macOS\. GNU Arm Embedded Toolchain, Arm Embedded GCC compiler, C, C\+\+

В отличие от десктопных проектов, многие embedded\-разработчики уже пишут проекты с учетом MISRA рекомендаций, и их поддержка в нашем анализаторе будет разработчикам однозначно полезна\. 

Тем не менее, мы всё равно опасаемся, что кто\-то из разработчиков, не разобравшись, может посчитать, что мы "испортили" анализатор внедрением в него "странных диагностик"\. Поэтому MISRA диагностики по умолчанию выключены\. Мы считаем это очень правильным решением\. Эти диагностики можно включать, только если вы точно понимаете для чего они нужны и как их использовать\.

Например, для прикладных программистов может быть непонятным, почему вдруг анализатор запрещает им использовать динамическую память\. Т\.е\. почему вдруг нельзя выделять память, используя функцию _malloc_ или оператор _new_\. Но такие ограничения \([V2511](https://pvs-studio.ru/ru/docs/warnings/v2511/)\) хорошо понятны разработчикам встраиваемых устройств\. В некоторых устройствах, работающих непрерывно, действительно недопустимо использование программ, для которых вдруг может кончиться память\.

Итак, теперь вы можете установить или обновить PVS\-Studio и начать использовать диагностики, реализующие правила из MISRA C и MISRA C\+\+\. Набор поддерживаемых правил неполон, но это не должно быть препятствием для начала использования PVS\-Studio\. На данный момент не существует ни одного статического анализатора, реализующего абсолютно все MISRA правила\. В дальнейшем мы планируем расширить набор диагностических правил, реализованных в MISRA, и надеемся стать лидирующим инструментом по полноте их поддержки\.

Чтобы включить MISRA диагностики в Visual Studio или в утилите PVS\-Studio Standalone, необходимо в настройках сменить значение Disabled на Show All\.

![0596_PVS_Studio_MISRA_ru/image3.png](https://import.viva64.com/docx/blog/0596_PVS_Studio_MISRA_ru/image3.png)

Поскольку Disabled означает, что предупреждения вообще не генерируются и не попадают в отчёт, то понадобится перезапуск анализа\. Режим Disabled по умолчанию установлен для того, чтобы сократить размер отчёта\. Включение MISRA диагностик может приводить к огромному количеству срабатываний и сильному увеличению файлов с отчётом \(\*\.plog \- файлов\)\.

Для анализа проектов в операционных системах Linux и macOS существует утилита pvs\-studio\-analyzer\. По умолчанию там включены только диагностики общего назначения \(General Analysis, GA\)\. Включить дополнительные правила можно с помощью опции "\-a":

```cpp
-a [MODE], --analysis-mode [MODE]
        MODE defines the type of warnings:
        1 - 64-bit errors;
        2 - reserved;
        4 - General Analysis;
        8 - Micro-optimizations;
        16 - Customers Specific Requests;
        32 - MISRA.
        Modes can be combined by adding the values
        Default: 4
```

Для включения предупреждений GA и MISRA необходимо запустить анализ со следующими параметрами:

```cpp
pvs-studio-analyzer analyze ... -a 36 ... -o /path/to/report.log ...
```

Значение 36 \- это побитовое ИЛИ для 4 \(GA \- диагностики общего назначения\) и 32 \(MISRA\)\.

Далее рекомендуется создать несколько отчётов с разными типами предупреждений, например, так:

```cpp
plog-converter -a GA:1,2 -t tasklist
  -o /path/to/ga_results.tasks /path/to/project.log
plog-converter -a MISRA:1,2,3 -t tasklist -m misra
  -o /path/to/misra_results.tasks /path/to/project.log
```

Первый отчёт "ga\_results\.tasks" будет содержать предупреждения общего назначения уровня достоверности High и Medium\.

А во второй отчёт "misra\_results\.tasks" попадут только предупреждения, относящиеся к MISRA всех уровней\. Ключ "\-m misra" указывает, что в отчёт, помимо номеров в формате PVS\-Studio, будут включены номера диагностик согласно классификации MISRA\.

Все режимы запуска анализатора в Linux и macOS, а также форматы отчётов, описаны в [документации](https://pvs-studio.ru/ru/docs/manual/0036/)\.

P\.S\. Мы хотим оценить, насколько мы угадали, выбрав MISRA в качестве одного из направлений развития PVS\-Studio\. Если Вас заинтересовала эта тема, просьба [написать нам](https://pvs-studio.ru/ru/about-feedback/)\. Даже если вы пока не планируете использовать PVS\-Studio, всё равно просим написать\. Мы хотим задать вам несколько уточняющих вопросов\.

Дополнительные ссылки:

1. [Скачать PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/download/)
1. [Как запустить PVS\-Studio в Linux и macOS](https://pvs-studio.ru/ru/docs/manual/0036/)
1. [Статический анализатор кода PVS\-Studio 6\.22 адаптирован для ARM\-компиляторов \(Keil, IAR\)](https://pvs-studio.ru/ru/blog/posts/cpp/0561/)
1. [В PVS\-Studio появилась поддержка GNU Arm Embedded Toolchain](https://pvs-studio.ru/ru/blog/posts/cpp/0588/)
1. [Классификация предупреждений PVS\-Studio согласно стандартам: MISRA C, MISRA C\+\+](https://pvs-studio.ru/ru/pvs-studio/sast/misra/)