2012-05-14 65 views
5

以下代碼在MISRA檢查上失敗。具體錯誤信息是:整數類型是如何隱式轉換的?

(MISRA-C:2004 10.1/R)整數類型的表達式的值應 不被隱式轉換到一個不同的基本類型,如果它是 不是轉換到一個相同的符號性

typedef enum _MyEnum { One, Two } MyEnum; 
MyEnum MyVariable; 

int foo(void) 
{ 
    int result = 1; 

    if (One == MyVariable) // fails here with MISRA-C:2004 10.1/R 
    { 
     result = 2; 
    }  
    return result; 
} 
  • 的更寬的整數類型爲何邏輯表達式轉換的α
  • 在這裏轉換什麼?
  • 爲什麼代碼通過MISRA檢查,當我交換OneMyVariable

編輯:編譯器是TI 「MSP430 C/C++編譯器V4.0.0」 與包括MISRA規則檢查。

+3

我已經有關於這MISRA thingy壞口袋。你在做什麼是完美的。 – cnicutar

+0

我想第二個編譯器bug假設 – Alex

+0

它是否產生'if(MyVariable == One){}'相同的錯誤/警告? – wildplasser

回答

-1

我會懷疑編譯器錯誤。你使用什麼編譯器? This post提到了使用TI編譯器時導致Misra 10.1/R失敗的編譯器錯誤。

+0

鏈接中的錯誤反映了另一個問題。這是一樣的MISRA檢查失敗,但它有錯誤地處理數組元素。它與枚舉和變量的順序無關。 – harper

+0

我知道。我剛剛提到它是一個由於編譯器錯誤而失敗的Misra檢查的例子。 – JesperE

+0

這是TI確認的錯誤。 – harper

0

我會懷疑編譯器在內部處理enumsunsigned integer,只要enum內沒有負值。

6

MISRA檢查器中沒有錯誤,它的行爲正確。你會得到這個錯誤,因爲C標準是有缺陷的和不合邏輯的。

有兩個項目:

  • One枚舉常量。標準§6.7.2.2/ 2規定,這應與int兼容,沒有例外。

  • MyVariable枚舉類型。標準§6.7.7.2/ 4規定這應該與char,一個有符號整數類型或一個無符號整數類型兼容。哪種類型適用於實現定義的行爲。

在你的情況,實現定義的枚舉類型看起來等於unsigned int。

因此,代碼嘗試將signed int變量隱式轉換爲unsigned int,這違反了MISRA 2004 10.1。

符合MISRA標準的代碼應該是if (One == (MyEnum)MyVariable)

+2

「標準」是C標準嗎?如果MyVariable是一個無符號整數,爲什麼交換One和MyVariable時檢查成功? – harper

+1

@harper是的,C標準ISO 9899:2011(C90是相同的)。那麼,交換必須是一個錯誤,那麼無論您使用哪個訂單,它都會給您一個錯誤。 – Lundin