2014-01-23 99 views
-1

這是我的代碼的一部分,我收到標題中提到的警告。註釋961:違反MISRA 2004諮詢規則12.6,運算符需要布爾表達式:'!'

代碼是

#define OMAP3_MCSPI_SYSSTATUS_RESETDONE  (1U)  
uint32_t tmp =6 ; 
while (!(tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE)) 

警告是

Note 961: Violates MISRA 2004 Advisory Rule 12.6, boolean expression required for operator: '!' 

爲什麼會收到這樣的警告?

+1

問題是什麼? – juanchopanza

+1

@juanchopanza'爲什麼我會得到這個警告?'根據Mark –

+0

因爲MISRA規則說你應該在這種情況下得到警告。 – juanchopanza

回答

0
while (!(tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE != 0)) 

,如果你想避免該警告

+0

嗨Wojtek,同樣的警告,我得到的其他行代碼,如果((strstr(flash-> name,「M25P」))!= NULL)..但仍然得到像警告613一樣的警告:可能使用空運算符'''左'參數中的'flash''我試圖用NULL檢查條件,但得到相同的警告 – Ashwin

+0

@Aswin - 這是一個不同的問題 - 我們需要查看所有使用和設置flash的代碼。 – Mark

3

的MISRA規則是

12.6(ADV)(從third party site這有可能改變因版權原因的規則引用):操作數的邏輯運算符(& &,||和!)應該是有效的布爾值。有效布爾值的表達式不應當用作(& &,||和!)以外的其他操作符的操作數。

這意味着您需要用布爾值替換表達式tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE。在這種情況下,正確的方法是將其與0比較。

例如,

while (!((tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE) != 0)) 
+2

我想你可能需要小心操作符的優先級。據我所知,!=比&更高的優先級,所以你最終會得到'!(tmp&(OMAP3_MCSPI_SYSSTATUS_RESETDONE!= 0))' –

0

'tmp'是一個32位無符號整數(uint32_t)。 'OMAP3_MCSPI_SYSSTATUS_RESETDONE'是一個無符號整數。使用'&'運算符''並將這些位合併在一起,產生另一個無符號整數。 MISRA規則要求你使用布爾表達式而不是無符號整數表達式作爲'!'的參數運營商。

爲了解決這個問題,你可以使用

while (!((tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE) != 0)) 

while ((tmp & OMAP3_MCSPI_SYSSTATUS_RESETDONE) != OMAP3_MCSPI_SYSSTATUS_RESETDONE)