Хабрахабр

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

PVS-Studio, MISRA C, MISRA C++

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

Таблицы соответствий диагностик PVS-Studio различным стандартам:

Теперь настало время стандартов MISRA C и MISRA C++. Это стандарты разработки программного обеспечения на языке C и C++, созданные организацией MISRA (Motor Industry Software Reliability Association). Цель стандартов — улучшить безопасность, переносимость и надежность программ для встраиваемых систем. Текст стандартов является платным.

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

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

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

Стандарты MISRA предназначены для упрощения и улучшения качества кода в целом, что помогает предотвращать ошибки. Поэтому мы изначально критически относились к стандартам MISRA и долгое время не планировали их реализовывать. Лучше всего это пояснить на примере. То есть в нем как раз большинство диагностик относится к стилю написания кода.

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

if (i == bestOffs) continue;

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

if (i == bestOffs)
{ continue;
}

Подобные диагностики невозможно применять к уже существующим проектам, написанным для работы под управлением операционной системы Winodws, Linux или macOS. Например, одно только описанное правило про фигурные скобки даёт 1947 срабатываний диагностики V2507 (MISRA C 15.6, MISRA C++ 6-4-1) для проекта WinMerge. А ведь WinMerge — это маленький проект! Всего около 250 000 строк кода на языке C и C++.

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

В этом году в анализаторе были поддержаны: Всё изменилось, когда в 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 диагностики по умолчанию выключены. Тем не менее, мы всё равно опасаемся, что кто-то из разработчиков, не разобравшись, может посчитать, что мы «испортили» анализатор внедрением в него «странных диагностик». Эти диагностики можно включать, только если вы точно понимаете для чего они нужны и как их использовать. Мы считаем это очень правильным решением.

Т.е. Например, для прикладных программистов может быть непонятным, почему вдруг анализатор запрещает им использовать динамическую память. Но такие ограничения (V2511) хорошо понятны разработчикам встраиваемых устройств. почему вдруг нельзя выделять память, используя функцию malloc или оператор new. В некоторых устройствах, работающих непрерывно, действительно недопустимо использование программ, для которых вдруг может кончиться память.

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

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

Включить MISRA

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

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

-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 необходимо запустить анализ со следующими параметрами:

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

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

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

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.

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

Все режимы запуска анализатора в Linux и macOS, а также форматы отчётов, описаны в документации.

S. P. Если Вас заинтересовала эта тема, просьба написать нам. Мы хотим оценить, насколько мы угадали, выбрав MISRA в качестве одного из направлений развития PVS-Studio. Мы хотим задать вам несколько уточняющих вопросов. Даже если вы пока не планируете использовать PVS-Studio, всё равно просим написать.

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

  1. Скачать PVS-Studio
  2. Как запустить PVS-Studio в Linux и macOS
  3. Статический анализатор кода PVS-Studio 6.22 адаптирован для ARM-компиляторов (Keil, IAR)
  4. В PVS-Studio появилась поддержка GNU Arm Embedded Toolchain

PVS-Studio: Support of MISRA C and MISRA C++ Coding Standards. Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Andrey Karpov.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть