Соответствует ли этот фрагмент кода 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 не стоит тех электронов, на которых он напечатан.

Другие вопросы по тегам