我正在使用在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);
案例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'
(又名'const unsigned char'
)投射到'const void *'
[MISRA 2012规则11.6,必填]memcpy((void*)data,(const void*)(buffer[2]),3U);
答案 0 :(得分:5)
刚刚;
memcpy( data, &buff[2], 3u ) ;
指针算法和强制转换都是不必要的,并且与MISRA规则相反。
强制转换为void*
可能会误解空指针的目的,并且通常强制转换可以抑制编译器可能会发出的重要警告。由此产生的混乱使代码更容易阅读和符合MISRA的代码。
您的第二种情况在语义上也是不正确的,并且不会导致正确的行为-警告并不总是警告;通常,它们表示语义错误。对于编译器“ error ”仅表示“ 无法编译”(语法错误); 语义错误是指代码未按预期执行的错误。
答案 1 :(得分:2)
我认为如果您更改指针算法
buff+2
在第一种情况下
&(buff[2])
MISRA警告应该消失
或者换句话说:在情况2中添加&运算符。