Я пытаюсь использовать проверку misra C: 2012 из cppcheck (v2.9). Однако при выполнении в конкретном файле я получаю следующие нарушения:
Vehicle_controller.c:1494:2: стиль: все идентификаторы, используемые в управляющем выражении директив предварительной обработки #if или #elif, должны быть #define перед оценкой. [мисра-c2012-20.9] #если ОС == LINUX_OS ^ источник/эмб/bwk/
Я использую следующую команду для выполнения:
$ cppcheck -DOS=LINUX_OS --addon=misra.json vehicle_controller.c
Есть ли другой способ пройти #define
, чтобы пройти проверку мисры?
Согласно примерам из правила 20.9, неопределенный идентификатор приводит к нулевому значению:
#if OS == 0 /* Non-compliant - OS may be zero or undefined */
...
#endif
Подход, совместимый с MISRA, заключается в том, чтобы идентификатор был определен перед использованием. Таким образом:
#ifndef OS
... /* OS is undefined */
#else
#if OS == 0
... /* OS is defined as zero */
#else
... /* OS is defined as non-zero */
#endif
#endif
cppcheck -DOS=LINIX
должно работать нормально. Вы уверены, что он не определен? R.20.9 требует, чтобы вы проверяли (согласно моему ответу), а не предполагали.
В качестве альтернативы #if defined(OS) && (OS == something)
, чтобы убедиться, что каждая строка безопасна сама по себе, или уменьшить количество вложенных #ifdef/#ifndef/#if
. Или еще один вариант: #ifndef OS ... #elif OS == 0 ... #else ... #endif
.
@Andrew Эндрю Странно, что когда я использую polyspace для проверки мисры, это не помечается как проблема. Я предположил, потому что OS
определен как часть конфигурации полипространства. Если этот метод синтаксиса требуется, чтобы сделать cppcheck пригодным для проверки ошибок, то я, вероятно, не смогу его использовать. К сожалению, это потребует масштабного рефакторинга кода.
Учитывая мою принадлежность, я не буду комментировать инструменты. Поскольку правило требуется, вы, конечно, можете отклоняться с обоснованием.
@Andrew Спасибо за информацию! Определенно помогает лучше понять это и понять цель Правил!
Я понимаю, в чем проблема. Я спрашиваю, как передать
#define
в командной строке или в каком-либо файле конфигурации. Я ДЕЙСТВИТЕЛЬНО определилOS
перед использованием. Это часть нашей конфигурации сборки. Я пытаюсь смоделировать это как-то в командной строке или в конфигурационном файле, используемом cppcheck и/или misra.py.