我使用的是标准memcpy函数,该函数在string.h .h文件中声明,因此:
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,规则18.4,咨询
memcpy((void*)data,(const void*)(buff+2),3U);
Case 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 sizeMISRA错误:
从
'const UINT8'(又名'const unsigned char')到'const void *'MISRA 2012规则11.6的显式转换,要求memcpy((void*)data,(const void*)(buffer[2]),3U);
发布于 2019-01-10 22:18:59
公正;
memcpy( data, &buff[2], 3u ) ;指针算法和转换都是不必要的,并且违背了MISRA规则。
对void*的强制转换相当错误地理解了空指针的用途,通常情况下,强制转换可以抑制编译器可能发出的基本警告。由此产生的去杂乱使代码更易于阅读和符合MISRA。
第二种情况在语义上也是不正确的,并且不会导致正确的行为--警告并不总是仅仅是警告;它们通常表示语义错误。对于编译器来说," error“仅仅意味着”无法编译“(语法错误);语义错误是指代码没有执行预期的错误。
发布于 2019-01-10 22:02:10
我想如果你改变指针算法
buff+2在第一种情况下
&(buff[2])米斯拉警告应该消失。
或者换句话说:在第2种情况中添加&-操作符。
https://stackoverflow.com/questions/54137411
复制相似问题