Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V2653. MISRA. The small integer...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V2653. MISRA. The small integer variants of the minimum-width integer constant macros should not be used.

18 Сен 2025

Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Правило актуально только для языка C.

Стандарт C требует, чтобы макросы целочисленных констант минимальной ширины (пункт 7. 20. 1.2 стандарта C11) раскрывались в integer constant expression. Это выражение (пункт 7.20.4.3 стандарта C11) должно подходить для использования с директивами #if, а также его тип должен быть таким же, как если бы к аргументу макроса был применён integer promotion.

Использование макросов целочисленных констант минимальной ширины не рекомендуется, так как приводит к путанице с подставляемыми типами.

Рассмотрим следующий пример:

void function_u8(uint8_t value){}
void function_int(int value) {}

#define MACRO_U8(Z) _Generic((Z)              \
                     , uint8_t: function_u8   \
                     , default: function_int)(Z)

void foo(void)
{
  MACRO_U8(UINT8_C(8));    // <=
}

UINT8_C — это макрос в языке C, предназначенный для обозначения беззнаковых 8-битных целочисленных констант. Он определяется в стандартных заголовочных файлах, таких как <stdint.h>, и используется для обеспечения переносимости кода между различными платформами и компиляторами.

Ожидается, что результат раскрытия макроса UINT8_C будет иметь тип uint8_t. Однако после применения integer promotion, так как ранг uint8_t меньше, чем int, результат будет таким же, как если бы аргумент был подставлен в код без изменений как целочисленная константа 8.

В результате _Generic selection выберет ассоциацию function_int(int value) вместо ожидаемой function_u8(uint8_t value).

Исправленный пример:

void function_u8(uint8_t value){}
void function_int(int value) {}

#define MACRO_U8(Z) _Generic((Z)              \
                     , uint8_t: function_u8   \
                     , default: function_int)(Z)

void foo(void)
{
  MACRO_U8((uint8_t)(8));
}

Данная диагностика классифицируется как:

  • MISRA-C-2023-7.6