繁体   English   中英

如何解决关于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错误:

通过加法[MISRA 2012 Rule 18.4,咨询] memcpy((void*)data,(const void*)(buff+2),3U);执行指针算术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 'const unsigned char' )显式转换为'const void *' [MISRA 2012 Rule 11.6,必需] memcpy((void*)data,(const void*)(buffer[2]),3U);

只是;

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

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

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

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

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

buff+2

在第一种情况下

&(buff[2])

MISRA警告应该消失。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM