Предварительное предупреждение:"Арифметическое переполнение: 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