首页 > 解决方案 > 如何解决与 memcpy 函数有关的 MISRA C:2012 错误?

问题描述

我正在使用在 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,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 错误:

'const UINT8'(aka 'const unsigned char') 到 'const void *'[MISRA 2012 Rule 11.6, required]的显式转换memcpy((void*)data,(const void*)(buffer[2]),3U);

标签: cembeddedmisra

解决方案


只是;

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

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

转换成一个void*相当误解空指针的目的,并且转换通常可以抑制编译器可能发出的基本警告。由此产生的整洁使代码更易于阅读并且符合 MISRA。

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


推荐阅读