c - 如何解决与 memcpy 函数有关的 MISRA C:2012 错误?
问题描述
我正在使用在 string.h 文件中声明的标准 memcpy 函数:
extern void * memcpy(void *, const void *, size_t);
案例 1:我的代码编译时没有任何错误或警告。
const uint8_t *buff = (uint8_t*)Getbuff();
uint8_t data[3] = {0};
memcpy((void*)data,(const void*)(buff+2),3U);
检查 MISRA C:2012 后,我收到以下 MISRA 错误:
通过加法执行指针算术[MISRA 2012 Rule 18.4,advisory]
memcpy((void*)data,(const void*)(buff+2),3U);
案例 2:如果我在案例 1 中修复 MISRA 错误:
const uint8_t *buff = (uint8_t*)Getbuff();
uint8_t data[3] = {0};
memcpy((void*)data,(const void*)(buff[2]),3U);
我收到编译时警告和不同的 MISRA 错误。
编译时警告:
cast to pointer from integer of different size
MISRA 错误:
从
'const UINT8'
(aka'const unsigned char'
) 到'const void *'
[MISRA 2012 Rule 11.6, required]的显式转换memcpy((void*)data,(const void*)(buffer[2]),3U);
解决方案
只是;
memcpy( data, &buff[2], 3u ) ;
指针算术和强制转换都是不必要的,并且违反 MISRA 规则。
转换成一个void*
相当误解空指针的目的,并且转换通常可以抑制编译器可能发出的基本警告。由此产生的整洁使代码更易于阅读并且符合 MISRA。
您的第二种情况在语义上也是不正确的,并且不会导致正确的行为 - 警告并不总是只是警告;它们通常表示语义错误。对于编译器“错误”只是意味着“无法编译”(语法错误);语义错误是代码没有按照预期执行的错误。
推荐阅读
- c++ - Visual Studio:snprintf 冲突的宏定义
- javascript - 如何从函数返回值?
- c# - 如何从 C# 中的 POST 请求中获取文本
- nginx - centos 7 nginx phpmyadmin 未找到
- python - 检查一个线段是否与一组线段相交
- php - JSON 数组:PHP 警告:array_count_values():只能计算 STRING 和 INTEGER 值
- ethereum - SSH 和以太坊节点
- git - 为什么git不能合并不同行不同变化的文本文件?
- c# - 将对象从 API 转换为字符串 C#
- android - 如何从 MapBox 的 LocationEngineProvider 创建 Observable?