繁体   English   中英

有关Misra规则11.6的查询(MISRA C:2012)

[英]Query regarding Misra rule 11.6 (MISRA C:2012)

我无法在此行中解决米斯拉规则11.6警告:

uint32_t * delay = (uint32_t *)0x40086D0C ;

[ 仅供参考: typedef long unsigned int uint32_t;]

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

我做了什么:

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

您能否分享有关我的问题的有用想法? 我们将不胜感激。

皮棉一如既往的破碎 提交错误报告或仅卸载Lint。

MISRA-C:2012规则11.6是关于从指针到void的转换为算术类型的指针! 因此,“从整数到指针的转换[MISRA 2012规则11.6,必需]”是不正确的废话,与引用的规则无关,他们不正确地引用了该引用。

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

因此,除了咨询规则外,您的代码还符合MISRA的要求,尽管您需要在整数常量后附加一个U后缀,以便确定其他规则:

uint32_t* delay = (uint32_t*)0x40086D0Cu ;

并且指针最有可能应该是volatile uint32_t* ,以便此代码有意义。

这是完全合理的强制转换(假设您的指针是32位)。 在这种情况下,最好让您的皮棉检查器忽略该行。 MISRA规则可以防止常见的错误,但是某些操作(例如访问内存映射的外围设备)在规范内无法完成(据我所知)。

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

对于memcpy()memset() ,您都不会看到性能下降。 任何值得精打细算的优化编译器都将检测到固定大小的memcpy ,并将其替换为单个32位MOV指令(或适用于您平台的模拟量)。 是c的例子

  1. 用32位移动替换了固定长度的内存集
  2. 意识到delay的值与addr的值相同
  3. 完全消除了delay

暂无
暂无

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

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