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

Андрей Карпов
Статей: 374



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

Picture 1

В этом году мы занялись поддержкой в анализаторе 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 есть правило, согласно которому тела операторов if должны быть заключены в фигурные скоки. В MISRA C это правило 15.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++.

До 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) хорошо понятны разработчикам встраиваемых устройств. В некоторых устройствах, работающих непрерывно, действительно недопустимо использование программ, для которых вдруг может кончиться память.

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

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

Рисунок 2

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

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

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

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

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

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



Найдите ошибки в своем C, C++, C# и Java коде

Предлагаем попробовать проверить код вашего проекта с помощью анализатора кода PVS-Studio. Одна найденная в нём ошибка скажет вам о пользе методологии статического анализа кода больше, чем десяток статей.

goto PVS-Studio;

Андрей Карпов
Статей: 374


Найденные ошибки

Проверено проектов
355
Собрано ошибок
13 303

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;