如何解决关于memcpy函数的MISRA C:2012错误?

时间:2019-01-10 21:50:14

标签: c embedded misra

我正在使用在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);

2 个答案:

答案 0 :(得分:5)

刚刚;

memcpy( data, &buff[2], 3u ) ;

指针算法和强制转换都是不必要的,并且与MISRA规则相反。

强制转换为void*可能会误解空指针的目的,并且通常强制转换可以抑制编译器可能会发出的重要警告。由此产生的混乱使代码更容易阅读符合MISRA的代码。

您的第二种情况在语义上也是不正确的,并且不会导致正确的行为-警告并不总是警告;通常,它们表示语义错误。对于编译器“ error ”仅表示“ 无法编译”(语法错误); 语义错误是指代码未按预期执行的错误。

答案 1 :(得分:2)

我认为如果您更改指针算法

buff+2

在第一种情况下

&(buff[2])

MISRA警告应该消失

或者换句话说:在情况2中添加&运算符。