[英]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,必填]
我做了什么:
您能否分享有關我的問題的有用想法? 我們將不勝感激。
皮棉一如既往的破碎 提交錯誤報告或僅卸載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的例子
delay
的值與addr
的值相同 delay
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.