2012-05-14 10 views
5

Il seguente codice non riesce su un controllo MISRA. Il messaggio di errore calcestruzzo è:Come vengono convertiti implicitamente i tipi integer?

(MISRA-C: 2004 10.1/R) il valore di un'espressione di tipo intero sono non essere implicitamente convertito in un tipo sottostante diversa, se è non una conversione di un più ampia tipo integer dello stesso signedness

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; 
} 
  • Perché viene convertita l'espressione logica?
  • Cosa viene convertito qui?
  • Perché il codice supera il controllo MISRA quando si scambiano One e MyVariable?

Edit: Il compilatore è un TI "MSP430 C/C++ Compiler v4.0.0" con incluso MISRA regole di controllo.

+3

Ho già brutti scherzi a proposito di questo MISRA. Quello che stai facendo è perfettamente a posto. – cnicutar

+0

Secondo l'ipotesi del bug del compilatore – Alex

+0

Produce lo stesso errore/avviso per 'if (MyVariable == One) {}'? – wildplasser

risposta

-1

Sospetto di un errore del compilatore. Che compilatore stai usando? This post menziona un bug del compilatore che causa errori di Misra 10.1/R quando si utilizza il compilatore di TI.

+0

Il bug nel collegamento fa riferimento a un altro problema.È lo stesso controllo MISRA che fallisce, ma esiste per il trattamento erroneo di un elemento dell'array. Non è correlato a un ordine di enum e variabile. – harper

+0

Lo so. L'ho appena citato come un esempio di un controllo di Misra che non è riuscito a causa di un bug del compilatore. – JesperE

+0

Questo è un bug confermato da TI. – harper

0

Sospetto che il compilatore gestisca internamente enums come unsigned integer, a condizione che non vi sia alcun valore negativo all'interno dello enum.

6

Non c'è alcun errore nel correttore MISRA, si comporta correttamente. Si ottiene questo errore perché lo standard C è imperfetto e illogico.

ci sono due elementi:

  • One è un enumerazione costante. Lo standard §6.7.2.2/2 afferma che questo deve essere compatibile con int, senza eccezioni.

  • MyVariable è un tipo elencato. Lo standard §6.7.7.2/4 afferma che questo dovrebbe essere compatibile con char, un tipo intero con segno o un tipo di intero senza segno. Quale tipo si applica è un comportamento definito dall'implementazione.

Nel tuo caso, il tipo enumerato implementazione definita sembra essere pari a unsigned int.

Quindi il codice tenta di convertire in modo implicito una variabile di firma int in unsigned int, che è una violazione di MISRA 2004 10.1.

Il codice conforme MISRA deve essere if (One == (MyEnum)MyVariable).

+2

"Lo standard" è lo standard C? Se MyVariable è un int unsigned, perché il controllo ha esito positivo quando scambio One e MyVariable? – harper

+1

@harper Sì, lo standard C ISO 9899: 2011 (C90 è identico). Bene, lo swap deve essere un bug quindi, dovrebbe darti un errore indipendentemente dall'ordine che usi. – Lundin

Problemi correlati