首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Misra规则第11.6条的询问(MISRA C:2012)

关于Misra规则第11.6条的询问(MISRA C:2012)
EN

Stack Overflow用户
提问于 2016-12-08 05:58:40
回答 2查看 2K关注 0票数 3

我无法解决这一行的misra规则第11.6条警告:

代码语言:javascript
复制
uint32_t * delay = (uint32_t *)0x40086D0C ;

FYI:长无符号整数uint32_t;

PC-Lint :注923:将int转换为指针MISRA 2012,规则11.6,必需

我所做的:

  • 显式键入类型,但不起作用
  • 使用memset(),它是工作的,但这不是解决Misra警告的正确方法。因为这是不必要的,增加了对系统的功能调用,这可能会降低系统性能。

关于我的问题,你能告诉我一个有用的想法吗?我们会很感激的。

EN

回答 2

Stack Overflow用户

发布于 2016-12-08 08:53:07

皮棉和往常一样坏了。提交错误报告或卸载Lint。

米斯拉-C:2012年规则11.6是关于从指针转换为无效的算术类型指针!因此,“从int转换到指针MISRA 2012 rule 11.6,required”是不正确的无稽之谈,与引用的规则无关,他们引用的规则是错误的。

有一个关于整数到指针转换的咨询规则11.4。该规则的目的是捕捉这样的转换会导致不正确地对齐指针的情况。但是,您可以忽略规则11.4而不引起偏差,因为它是咨询性的。

因此,除了咨询规则之外,您的代码是兼容MISRA的,尽管您需要在整数常量中附加U后缀以补充其他规则:

代码语言:javascript
复制
uint32_t* delay = (uint32_t*)0x40086D0Cu ;

指针很可能是volatile uint32_t*,这样代码才有意义。

票数 5
EN

Stack Overflow用户

发布于 2016-12-08 06:35:47

这是一个完全合理的转换(假设您的指针是32位)。在这种情况下,最好让你的衣领检查器忽略这一行。MISRA规则是为了防止常见的bug,但是一些操作,比如访问内存映射的外围设备,不能在规范中完成(据我所知)。

使用memset是一个非常糟糕的主意--它设置单个字节,因此需要4个memset()调用来设置指针的4个字节。您可以通过一个memcpy()调用获得类似的效果,尽管我不认为它符合规范的精神。

对于memcpy()memset(),您不应该看到性能下降。任何值得其salt的优化编译器都将检测到固定大小的memcpy,并将其替换为单个32位MOV指令(或用于平台的模拟)。这里是clang的一个例子

  1. 将固定长度memset替换为32位移动。
  2. 认识到delay的值与addr的值相同
  3. 完全删除delay
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41032719

复制
相关文章

相似问题

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