首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决MISRA C:2012有关memcpy函数的错误?

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

Stack Overflow用户
提问于 2019-01-10 21:50:14
回答 2查看 1.9K关注 0票数 0

我使用的是标准memcpy函数,该函数在string.h .h文件中声明,因此:

代码语言:javascript
复制
extern void *   memcpy(void *, const void *, size_t);

案例1:编译我的代码时没有任何错误或警告。

代码语言:javascript
复制
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错误,那么:

代码语言:javascript
复制
const uint8_t *buff = (uint8_t*)Getbuff();
uint8_t data[3] = {0};
memcpy((void*)data,(const void*)(buff[2]),3U);

我收到编译时警告和一个不同的MISRA错误。

编译时警告:

代码语言:javascript
复制
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);

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-10 22:18:59

公正;

代码语言:javascript
复制
memcpy( data, &buff[2], 3u ) ;

指针算法和转换都是不必要的,并且违背了MISRA规则。

void*的强制转换相当错误地理解了空指针的用途,通常情况下,强制转换可以抑制编译器可能发出的基本警告。由此产生的去杂乱使代码更易于阅读和符合MISRA。

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

票数 5
EN

Stack Overflow用户

发布于 2019-01-10 22:02:10

我想如果你改变指针算法

代码语言:javascript
复制
buff+2

在第一种情况下

代码语言:javascript
复制
&(buff[2])

米斯拉警告应该消失。

或者换句话说:在第2种情况中添加&-操作符。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54137411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档