Предупреждение перед предварительным просмотром: «Арифметическое переполнение: 32-разрядное значение смещается, а затем приводится к 64-разрядному значению». - PullRequest
0 голосов
/ 08 марта 2019

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

#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 Ответ

0 голосов
/ 08 марта 2019

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

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

#define F_MASK_4_BIT 0xFull
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...