Предупреждение 639: Сильное несоответствие типов для типа ‘uint64’ в двоичной операции

Я получаю эти предупреждения в разных файлах. Я пытался решить ее, но все еще с тем же предупреждением для всех (все 6 сценариев).

#define CMD_READ_ARRAY_FAST  0x0bU
uint64 page_size;
uint32 offset;
uint64 page_addr;
uint64 sector_size;
uint8_t cmd[5];
size_t len;
size_t actual;

1) page_addr = (uint64) (offset / page_size);

2)  cmd[0] = CMD_READ_ARRAY_FAST;
cmd[1] = (uint8_t) (page_addr >> 8U);
cmd[2] = (uint8_t) page_addr;
cmd[3] = (uint8_t) (offset % page_size);
cmd[4] = 0x00U;

3)page_addr = (uint64) (offset / page_size);
4)byte_addr = (uint64) (offset % page_size);
5)if ((offset % sector_size) || (len % sector_size))
6)cmd[1] = (uint8_t) ((offset / sector_size) + actual);

Можете ли вы сказать мне причину этого?

0

Решение

Я решил вышеуказанную проблему следующим образом:

#define CMD_READ_ARRAY_FAST  0x0bU
uint64 page_size;
uint32 offset;
uint64 page_addr;
uint64 sector_size;
uint8_t cmd[5];
size_t len;
size_t actual;

1) page_addr = (uint64) (offset / page_size);
Ans: (uint64) ((uint64)offset / page_size);

2)  cmd[0] = CMD_READ_ARRAY_FAST;
cmd[1] = (uint8_t) (page_addr >> 8U);
cmd[2] = (uint8_t) page_addr;
cmd[3] = (uint8_t) (offset % page_size);
cmd[4] = 0x00U;

Ans:cmd[0] = CMD_READ_ARRAY_FAST;
cmd[1] = (uint8_t) (page_addr >> 8U);
cmd[2] = (uint8_t) page_addr;
cmd[3] = (uint8_t) ((uint8_t)offset % page_size);
cmd[4] = 0x00U;3)page_addr = (uint64) (offset / page_size);
Ans: page_addr = (uint64) ((uint64)offset / page_size);

4)byte_addr = (uint64) (offset % page_size);
Ans: byte_addr = (uint64) ((uint64)offset % page_size);

5)if ((offset % sector_size) || (len % sector_size))
Ans: if (((uint64)offset % sector_size) || ((uint64)len % sector_size)) {

6)cmd[1] = (uint8_t) ((offset / sector_size) + actual);
Ans: cmd[1] = (uint8_t) (((uint8_t)offset / (uint8_t)sector_size) + (uint8_t)actual);
0

Другие решения

Ваши предупреждения происходят от смешивания различных целочисленных типов в одном выражении и последующего использования неявных приведений. Неявные броски всегда плохи, MISRA или нет.

Следующие исправления, надеюсь, очистят все предупреждения:

1)

page_addr = (uint64_t)offset / page_size;

2) Все выглядит нормально, кроме 3-го ряда.

cmd[3] = (uint8_t) ((uint64_t)offset % page_size);

3) Снова приведите uint32_t к uint64_t перед операцией.

4) Снова приведите uint32_t к uint64_t перед операцией.

5) Несколько нарушений MISRA здесь. Лучше всего переписать его в несколько строк, а не в длинную, нечитаемую. Например:

bool cond1 = ((uint64_t)offset % sector_size) != 0;
bool cond2 = ((uint64_t)len % sector_size) != 0;

if (cond1 || cond2)

6) Вероятно, эта строка должна состоять из нескольких строк, чтобы ее можно было прочитать:

uint64_t tmp = (uint64_t)offset / sector_size;
cmd[1] = (uint8_t) (tmp + (uint64_t)actual);
0

По вопросам рекламы [email protected]