2012-05-14 12 views
5

Der folgende Code schlägt bei einer MISRA-Prüfung fehl. Die konkrete Fehlermeldung ist:Wie werden Integer-Typen implizit konvertiert?

(MISRA-C: 2004 10,1/R), um den Wert eines Ausdrucks von Integer-Typ wird nicht implizit zu einem anderen Basiswerttyp umgewandelt werden, wenn es keine Umwandlung zu a ist breite integer-Typ derselben 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; 
} 
  • Warum ist der logische Ausdruck umgewandelt?
  • Was wird hier konvertiert?
  • Warum besteht der Code die MISRA-Prüfung, wenn ich One und MyVariable austauschen?

bearbeiten: Der Compiler ist ein TI "MSP430 C/C++ Compiler v4.0.0" mit inbegriffen MISRA Prüfregeln.

+3

Ich habe schon schlechte Argumente über dieses MISRA-Ding. Was du machst, ist vollkommen in Ordnung. – cnicutar

+0

Ich würde die Compiler Fehlerhypothese Sekunde – Alex

+0

Setzt es die gleiche Fehler/Warnung für 'if (MyVariable == One) {} '? – wildplasser

Antwort

-1

Ich würde einen Compiler Bug vermuten. Welchen Compiler benutzen Sie? This post erwähnt einen Compiler-Fehler, der Misra 10.1/R-Fehler verursacht, wenn der TI-Compiler verwendet wird.

+0

Der Fehler in der Verknüpfung verweist auf ein anderes Problem.Es ist derselbe MISRA-Test, der fehlschlägt, aber es gibt einen Fehler bei der Behandlung eines Array-Elements. Es hängt nicht von einer Reihenfolge von Enum und Variable ab. – harper

+0

Ich weiß. Ich habe es gerade als Beispiel für eine Misra-Prüfung erwähnt, die aufgrund eines Compiler-Fehlers fehlschlug. – JesperE

+0

Dies ist ein Fehler, wie von TI bestätigt. – harper

0

Ich würde vermuten, dass der Compiler intern enums als unsigned integer behandelt, solange es keinen negativen Wert innerhalb der enum gibt.

6

Es gibt keinen Fehler im MISRA-Checker, er verhält sich korrekt. Sie erhalten diesen Fehler, weil der C-Standard fehlerhaft und unlogisch ist.

Es gibt zwei Elemente:

  • One ist eine Enumerationskonstante. Der Standard §6.7.2.2/2 besagt, dass dies kompatibel sein soll mit int, keine Ausnahmen.

  • MyVariable ist ein aufgezählten Typ. Der Standard §6.7.7.2/4 besagt, dass dies mit char, einem vorzeichenbehafteten Integer-Typ oder einem vorzeichenlosen Integer-Typ kompatibel sein sollte. Welcher Typ zutrifft, ist ein implementierungsdefiniertes Verhalten.

In Ihrem Fall scheint der implementierungsdefinierte Aufzählungstyp gleich unsigned int zu sein.

Also der Code versucht, eine Variable von vorzeichenbehafteten int in unsigned int zu konvertieren, was eine Verletzung von MISRA 2004 10.1 ist.

MISRA-konformer Code sollte if (One == (MyEnum)MyVariable) sein.

+2

"Der Standard" ist der C-Standard? Wenn MyVariable ein vorzeichenloser int ist, warum ist die Überprüfung erfolgreich, wenn ich One und MyVariable tausche? – harper

+1

@harper Ja, die C-Norm ISO 9899: 2011 (C90 ist identisch). Nun, der Tausch muss ein Fehler sein, er sollte Ihnen einen Fehler geben, egal welche Reihenfolge Sie verwenden. – Lundin