c - 这段代码符合 MISRA C 标准吗?
问题描述
我必须在车辆的 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
我想知道在字符缓冲区中执行 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);
解决方案
MISRA C 不禁止使用 memcpy()
MISRA C:2012 Amendment 1(可免费下载)提供了一些关于使用 memcpy() 帮助避免 C 标准中普遍存在的未定义/未指定行为的一些指导 - 有很多工具可以帮助您分析代码
注意:请参阅免责声明简介
推荐阅读
- javascript - chrome 扩展中的 Gmail API 不会发送电子邮件
- php - PHPMailer 将无法工作。我已经完成了github所说的但仍然无法正常工作
- javascript - 当我只删除一个元素时,React.js 会更新部分 DOM 节点
- python - 需要帮助将公式 D=2∑ni=1{Ylog[YE(Y)]−[Y−E(Y)]} 转换为 python 代码
- javascript - 锁定用于滑动/滚动的 touchstart 事件
- javascript - Ember.js 在 ember.js 中创建新路由总是会导致默认 index.html 文件
- javascript - 如何在 vanilla javascript 中加载本地文件?
- firefox - 消息“WEBGL_debug_renderer_info 在 Firefox 中已弃用并将被删除。请使用 RENDERER。”是什么意思 意思是?
- python - 合并熊猫数据框以生成带有列表的数据框
- reactjs - react-native-view-shot 仅捕获相机元素内容