这段代码是否符合MISRA C?

时间:2018-07-30 15:02:15

标签: c standards-compliance misra

我必须在车辆的LAN中发送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

我想知道在chars缓冲区中执行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 个答案:

答案 0 :(得分:1)

MISRA C不禁止使用memcpy()

MISRA C:2012 Amendment 1(免费下载)提供了一些有关使用memcpy()来帮助避免C标准中某些未定义/未指定行为的指南-有很多工具可帮助您分析您的代码

注意:请参阅个人资料以免责声明

答案 1 :(得分:0)

用于复制已知大小的字节块的正确工具是memcpy()。如果MISRA为您着迷,那么MISRA不值得用它打印的电子。