[英]How to resolve MISRA C:2012 error regarding to memcpy function?
我正在使用在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,咨询]
memcpy((void*)data,(const void*)(buff+2),3U);
执行指针算术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'const unsigned char'
)显式转换为'const void *'
[MISRA 2012 Rule 11.6,必需]memcpy((void*)data,(const void*)(buffer[2]),3U);
只是;
memcpy( data, &buff[2], 3u ) ;
指针算术和强制转换都是不必要的,并且与MISRA规则相反。
强制转换为void*
误解void指针的目的,并且通常可以强制转换编译器否则可能发出的重要警告。 由此产生的混乱使代码更易于阅读并且符合MISRA。
您的第二种情况在语义上也是不正确的,并且不会导致正确的行为-警告并不总是警告 。 通常,它们表示语义错误。 对于编译器,“ 错误 ”仅表示“ 无法编译 ”(语法错误); 语义错误是指代码未按预期执行的错误。
我认为如果您更改指针算法
buff+2
在第一种情况下
&(buff[2])
MISRA警告应该消失。
换句话说:在情况2中添加&运算符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.