MISRA: составное выражение типа «по существу, без знака» (без знака) преобразуется в более широкий тип без знака, «без знака» при назначении - PullRequest
0 голосов
/ 25 марта 2020

фрагмент моего кода:

uint16 myArray_A[5];
uint8 myArray_B[10] = {0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x10};
uint8 idx = 0;

for (idx= 0; idx< 5; idx++)
{ 
     myArray_A[idx] = ((myArray_B[idx *2]<<8) | myArray_B[((idx++ *2)+1)]);
}

Код работает до сих пор. Но я получаю предупреждение MISRA от субъекта. Есть идеи как их избежать?

1 Ответ

8 голосов
/ 25 марта 2020

У вас много проблем в этом коде.

  • Возможно, указанное предупреждение c касается операндов |, являющихся uint8, но вы назначаете их более широкому типу без знака. uint16. В общем, вам нужно изучить Неявные правила продвижения типов , если вы хотите попробовать соответствие MISRA. Сам документ MISRA также является хорошим учебным материалом по этому вопросу.
  • myArray_B[idx *2]<<8 не зависит от опасного кода MISRA, поскольку происходит автоматическое продвижение к подписанному типу. Я рекомендую всегда преобразовывать в большой целочисленный тип без знака перед использованием сдвигов битов.
  • Аналогично, | выполняется для продвинутых операндов, которые подписаны.
  • myArray_A[idx] = ... idx++ - это FAQ новичок ошибка, вызывая неопределенное поведение. Вы не можете написать такой код в C. Почему эти конструкции используют неопределенное поведение до и после приращения? .
  • Изменение итератора al oop изнутри a для l oop - ужасная практика и нарушение MISRA- C 14.2.
  • Не используйте целочисленные типы домашнего приготовления, используйте stdint.h.
  • MISRA требует суффикс u для целочисленных констант, которые должны быть беззнаковыми (хотя в данном конкретном случае c не имеет значения).

Чтобы исправить ошибки и получить соответствие MISRA- C, вы должны переписать его во что-то вроде этого:

uint16_t myArray_A[5];
uint8_t myArray_B[10] = {0x1u,0x2u,0x3u,0x4u,0x5u,0x6u,0x7u,0x8u,0x9u,0x10u};

for (uint8_t i=0u; i<5u; i++)
{ 
     myArray_A[i] = ((uint16_t)myArray_B[i*2u] << 8u) |
                    ((uint16_t)myArray_B[i*2u + 1u]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...