Предварительное предупреждение:"Арифметическое переполнение: 32-разрядное значение смещается, а затем приводится к 64-разрядному значению".

Я объявил макросы как это:

#define F_MASK_4_BIT 0xF
#define GET_F_4BIT_MASK(F, P) (((F) & (F_MASK_4_BIT << (P * 4))) >> (4 * P))

используя макрос как это:

uint8_t Feature = GET_F_4BIT_MASK(E, P);

Где E - тип данных uint64_t. P - тип данных uint8_t.

Что выдает предупреждение Prefast: C6297: Арифметическое переполнение: 32-разрядное значение смещается, а затем приводится к 64-разрядному значению. Результаты не могут быть ожидаемым значением.

Как это исправить?

1 ответ

Решение

Это довольно понятно. Если P имеет любое значение больше 7 (7*4=28, макс. 31), F_MASK_4_BIT << (P * 4) переполнится. Так как F_MASK_4_BIT целочисленная константа типа int,

Исправьте это, используя соответствующий тип для целочисленной константы:

#define F_MASK_4_BIT 0xFull
Другие вопросы по тегам