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

时间:2016-12-08 05:58:40

标签: c misra

我无法在这一行中解决伊布拉规则11.6警告:

uint32_t * delay = (uint32_t *)0x40086D0C ;

[ FYI: typedef long unsigned int uint32_t;]

  

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

我做了什么:

  • 明确地输入类型,但它不起作用
  • 使用memset(),它正在工作,但这不是解决Misra警告的正确方法。因为这是系统上不必要的增加函数调用,它可能会降低系统性能。

你能否就我的问题分享一个有用的想法?非常感谢。

2 个答案:

答案 0 :(得分:4)

皮棉一如既往地破碎。提交错误报告或只是卸载Lint。

MISRA-C:2012规则11.6关于从指向void的指针到算术类型的指针!因此"从int转换为指针[MISRA 2012规则11.6,要求]"是不正确的废话,与引用的规则无关,他们引用的不正确。

有关于整数到指针转换的咨询规则11.4。该规则的目的是捕获这样的强制转换会导致指针错误对齐的情况。但是,您可以忽略规则11.4而不会产生偏差,因为它是建议性的。

因此,除了通知规则之外,您的代码符合MISRA标准,尽管您需要在整数常量后附加U后缀以满足其他规则:

uint32_t* delay = (uint32_t*)0x40086D0Cu ;

并且指针很可能是volatile uint32_t*,以使此代码有意义。

答案 1 :(得分:-1)

这是一个完全合理的演员表(假设你的指针是32位)。在这种情况下,告诉您的lint检查器忽略该行可能更好。 MISRA规则用于防止常见的错误情况,但是某些操作(如访问内存映射外设)无法在规范内完成(据我所知)。

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

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

的一个例子
  1. 用32位移动替换了固定长度的memset
  2. 意识到delay的值与addr
  3. 的值相同
  4. 完全删除了delay