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

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 错误:

performing pointer arithmetic via addition [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 错误:

explicit cast from 'const UINT8' (aka 'const unsigned char') to 'const void *' [MISRA 2012 Rule 11.6, required]memcpy((void*)data,(const void*)(buffer[2]),3U);

我想如果你改变指针算法

buff+2

第一种情况为

&(buff[2])

MISRA 警告应该会消失。

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

刚刚;

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

指针运算和强制转换都是不必要的,并且违反了 MISRA 规则。

强制转换为 void* 会误解空指针的用途,并且强制转换通常可以抑制编译器可能发出的基本警告。由此产生的杂乱使代码更易于阅读 MISRA 兼容。

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