MISRA C:2012 Rule 5.4

Макро-идентификаторы должны быть отличными

Описание

Управляйте определением

Макро-идентификаторы должны быть отличными.

Объяснение

Имена макро-идентификаторов должны быть отличны и от других макро-идентификаторов и от их параметров.

Реализация Polyspace

Средство проверки повышает нарушение, если два макросов, которые имеют те же первые 63 символа, заданы с различными значениями. Средство проверки не повышает нарушение если:

  • Два макросов с теми же первыми 63 символами заданы с тем же значением (даже пустое значение).

  • Тот же макрос задан с различными значениями, но макрос не определен промежуточный.

Сокращение 63 символов применяется к основанному на C99 анализу. В C90 сокращение является 31 символом. Другими словами, средство проверки рассматривает два макросов как эффективно то же самое, если нет никакого различия в их первом 31 символе. Чтобы использовать проверку правил C90, используйте значение c90 для опции C standard version (-c-version). Можно изменить количество символов, сравненных с помощью опции -code-behavior-specifications. Смотрите -code-behavior-specifications.

Дополнительное сообщение в отчете

  • Макро-идентификаторы должны быть отличными. Макрос XX имеет те же значительные символы как макро-YY.

  • Макро-идентификаторы должны быть отличными. Макро-параметр XX имеет те же значительные символы как макро-параметр YY в макро-ZZ.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#define engine_exhaust_gas_temperature_raw egt_r
#define engine_exhaust_gas_temperature_scaled egt_s   /* Non-compliant */

#define engine_exhaust_gas_temp_raw egt_r
#define engine_exhaust_gas_temp_scaled egt_s          /* Compliant */

В этом примере, макро-engine_exhaust_gas_temperature_scaled egt_s имеет тот же первый 31 символ как предыдущий макро-engine_exhaust_gas_temperature_scaled.

#define engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_raw egt_r
#define engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_raw_scaled egt_s /* Non-compliant */

/* 63 significant case-sensitive characters in macro identifiers */
#define new_engine_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_raw egt_r
#define new_engine_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_scaled egt_s /* Compliant */

В этом примере, макро-engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx___gaz_scaled имеет те же первые 63 символа как предыдущий макро-engine_xxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx_xxxxxxxxx___raw.

Проверяйте информацию

Группа: Идентификаторы
Категория: необходимый
Категория AGC: необходимый
Введенный в R2014b