Соответствует ли этот фрагмент кода MISRA C?
Я должен отправить UDP-пакеты в локальной сети автомобиля. Пакет UDP состоит из 5 полей:
field_1: 4 bytes uint32_t
field_2: 1 byte uint8_t
field_3: 1 byte uint8_t
field_3: 2 bytes uint16_t
field_4: 20 bytes 5*float
Интересно, если выполнение memcpy в буфере символов совместимо с MISRA C, код приведен здесь:
uint32_t field_1 = 25;
uint8_t field_2 = 34;
uint8_t field_3 = 1;
uint16_t field_4 = 234;
float field_5[5] = {1,2,3,4,5};
/* Allocate memory for the buffer*/
int l_buffLen = sizeof(uint32_t)
+ sizeof(uint8_t)
+ sizeof(uint8_t)
+ sizeof(uint16_t)
+ 5*sizeof(float);
char buffer[l_buffLen];
/* Copy data to the buffer */
int idx = 0;
memcpy(&buffer[idx],&field_1,sizeof(uint32_t));
idx+=sizeof(uintt32_t);
memcpy(&buffer[idx],&field_2,sizeof(uint8_t));
idx+=sizeof(uint8_t);
memcpy(&buffer[idx],&field_3,sizeof(uint8_t));
idx+=sizeof(uint8_t);
memcpy(&buffer[idx],&field_4,sizeof(uint16_t));
idx += sizeof(uint16_t);
memcpy(&buffer[idx],field_5,sizeof(float)*5);
2 ответа
MISRA C не запрещает использование memcpy()
MISRA C: Поправка 1 2012 года (доступна для бесплатной загрузки) предоставляет некоторые рекомендации по использованию memcpy(), чтобы помочь избежать некоторых неопределенных / неуказанных поведенческих особенностей в Стандарте C - существует множество инструментов, которые помогут вам в анализе вашего кода
Примечание: см. Профиль для отказа от ответственности
Правильный инструмент для копирования копий байтов известного размера memcpy()
, Если MISRA вас за это попросит, то MISRA не стоит тех электронов, на которых он напечатан.