我无法在这一行中解决伊布拉规则11.6警告:
uint32_t * delay = (uint32_t *)0x40086D0C ;
[ FYI: typedef long unsigned int uint32_t;]
PC-Lint:注释923:从int转换为指针[MISRA 2012规则11.6,必需]
我做了什么:
你能否就我的问题分享一个有用的想法?非常感谢。
答案 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
delay
的值与addr
delay