Upload
zuehlke
View
1.239
Download
2
Embed Size (px)
DESCRIPTION
Mehr dazu in meinem Blogbeitrag http://bit.ly/MISRA_C. MISRA-C schützt vor Pannen beim Programmieren in C. Der Standard ist Anfang 2013 aktualisiert worden. Was bringt die neue Version? Der MISRA-C Standard bündelt in Summe die Erfahrung vieler hundert Jahre Programmiererfahrung mit C. Die aktuelle Version MISRA-C:2012 besteht aus 16 Direktiven und 143 Regeln auf insgesamt 236 Seiten. Noch ist allerdings größtenteils der Vorgänger MISRA-C:2004 in Gebrauch, teilweise sogar die noch ältere Version MISRA-C:1998.
Citation preview
MISRA-C:2012 Matthias Kraaz
© Zühlke 2013
printf("%d", 4 + 1 % 5);
/* Ausgabe: 5 */
uint32_t a = 1; int32_t b = -1;
if(a < b) { printf("Ups"); }
/* Ausgabe: Ups */
Können Sie C?
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 2
© Zühlke 2013
printf("%d %d", i++, i);
/* Unspezifiziert: 0 0 oder 0 1 */
int a = 128; printf("%d", a + a);
/* Plattformabhängig: 0 oder 256 */
printf("%d", 1 << -1);
/* Undefiniert: Absturz, EEPROM löschen, gar nichts */
Können Sie C?
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 3
© Zühlke 2013
int x = 2; int flag = 0;
switch(x) { case 1: if(flag) { case 2: printf("Ups"); } break; }
/* Ausgabe: Ups */
Können Sie C?
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 4
© Zühlke 2013
• Verwirrend kompliziert
• Teilweise unspezifiziert – Compiler reagiert „flexibel“
• Teilweise plattformabhängig
• Teilweise undefiniert – Absturz oder irgendwas anderes
Probleme von C
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 5
© Zühlke 2013
MISRA-C:2012 • Programmierrichtlinie für C90 und C99
• Veröffentlichung März 2013
• Vorgänger: MISRA-C:1998, MISRA-C:2004
• 16 Direktiven, 143 Regeln, 236 Seiten
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 6
© Zühlke 2013
• Plattform-Spezifika verstanden und dokumentiert
• Traceability auf Anforderungen
• Defensive Programmierung
• Fehlercodes abtesten
• Lieber Funktionen statt Makros
• Gut lesbare Bezeichner
• Keine dynamische Speicherverwaltung
• …
16 Direktiven
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 7
© Zühlke 2013
143 Regeln
• A standard C environment
• Unused Code
• Comments
• Character sets
• Identifiers
• Types
• Literals and constants
• Declarations and definitions
• Initialization
• Pointer type conversions
• Expressions
• Side effects
• Control statement expressions
• Control flow
• Switch statements
• Functions
• Pointers and arrays
• Overlapping storage
• Preprocessing directives
• Standard Libraries
• Resources
• …
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 8
© Zühlke 2013
printf("%d", 4 + 1 % 5);
/* Regel 12.1: Reihenfolge mit Klammern verdeutlichen! */
uint32_t a = 1; int32_t b = -1;
if(a < b) { printf("Ups"); }
/* Regeln 10.x: Keine implizite Konvertierung zwischen signed und unsigned! */
Was meint MISRA-C dazu?
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 9
© Zühlke 2013
printf("%d %d", i++, i);
/* Regel 13.2: Keine unspezifizierten Ergebnisse! */
int a = 128; printf("%d", a + a);
/* Direktive 4.6: Basistypen nicht direkt verwenden! */
printf("%d", 1 << -1);
/* Keine Bitoperationen auf Typen mit Vorzeichen! */
Was meint MISRA-C dazu?
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 10
© Zühlke 2013
int x = 2; int flag = 0;
switch(x) { case 1: if(flag) { case 2: printf("Ups"); } break; }
/* Kapitel Switch Statements: so nicht! */
Was meint MISRA-C dazu?
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 11
© Zühlke 2013
• Endlich auch C99 unterstützt
• Präziser formuliert
• Besser automatisiert prüfbar
• Kaum Änderung des Umfangs
• Kaum Änderung der Intention der Regeln
Änderungen gegenüber MISRA-C:2004
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 12
© Zühlke 2013
Alt (MISRA-C:2004)
• Automatisierte Prüfung: Anwarnung aller Makros mit Parametern
• Folge: Gewohnheitsmäßiges Ignorieren
Neu (MISRA-C:2012)
• Manuelle Prüfung durch Review
• Fallweise Diskussion
• Sinnvolle Maßnahmen
„Funktionen statt Makros“
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 13
© Zühlke 2013
Alt (MISRA-C:2004)
• Automatisierte Prüfung: Anwarnung aller nicht verwendeten Rückgabewerte
• Folge: Gewohnheitsmäßiges Ignorieren
Neu (MISRA-C:2012)
• Direktive „Fehlercodes abtesten“
• Regel „Rückgabewerte verwenden oder auf (void) casten“
• Bisherige Implementation abgesegnet, Aufgabe für Review herausgetrennt
„Fehlercodes abtesten“
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 14
© Zühlke 2013
Rule 12.1 (advisory): Limited dependence should be placed on C’s operator precedence rules in expressions
In addition to the use of parentheses to override… However, do not add too many parentheses so as to clutter the code and make it unreadable…
A + B + C /* OK */
A + B - C /* Eher Warnung */
A + B / C /* Warnung */
A – B – C /* Je nach Prüfwerkzeug */
A + (B + C) /* Je nach Prüfwerkzeug */
Klammerung – Alt (MISRA-C:2004)
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 15
© Zühlke 2013
Rule 12.1 The precedence of operators within expressions should be made explicit
Category Advisory
Analysis Decidable, Single Translation Unit
Applies to C90, C99
Amplification haarkleine, exakte Spezifikation
Rationale ausführliche Erklärung
Examples viele Beispiele
Klammerung – Neu (MISRA-C:2012)
MISRA-C:2012 | Matthias Kraaz
A + B + C /* OK */
A + B - C /* OK */
A + B / C /* Warnung */
A – B – C /* OK */
A + (B + C) /* OK */ 3. Dezember 2013 Folie 16
© Zühlke 2013
„Kein unerreichbarer Code“ Alt (MISRA-C:2004)
• Regel: Kein unerreichbarer Code (½ Seite)
• Sehr uneinheitliche Umsetzung
Neu (MISRA-C:2012)
• Regel: Kein unerreichbarer Code (2 Seiten)
• Regel: Kein toter Code (1½ Seiten)
• Regel: Keine unbenutzten Typen, Tags, Makros, Labels, Parameter (2 Seiten)
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 17
© Zühlke 2013
„Kein goto“ Alt (MISRA-C:2004)
• Regel: Kein goto
• Wunderbar prüfbar
• Folge: Manchmal wurde goto trotzdem verwendet
Neu (MISRA-C:2012)
• Regel: Kein goto
• Zusätzliche Regeln: Folgende gotos nicht…
• Schutz gegen besonders schlechte gotos, auch wenn vollständiges Verbot von goto ignoriert wird
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 18
© Zühlke 2013
War Story • Int. Konzern wechselt von Prüfwerkzeug A auf B
• Pilotprojekt mit ~ 100.000 Zeilen Code
• Plötzlich ~ 5.000 Warnungen
• A kann nicht alle MISRA-C:2004 Regeln
• B kann nicht alle MISRA-C:2004 Regeln, aber andere
3. Dezember 2013 MISRA-C:2012 | Matthias Kraaz Folie 19
© Zühlke 2013
Erwartung Illusion Hoffnung • Harmonisierung der Ergebnisse verschiedener
Prüfwerkzeuge
• Implementation aller Regeln wird zum Standard
• Weniger Aufwand für Konformität – weniger überraschende Warnungen – bessere Verständlichkeit der Regeln
• Weniger Aufwand für Schulung
• Prüfwerkzeuge besser austauschbar
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 20
© Zühlke 2013
• LDRArules von LDRA
• QA-C von Programming Research
• PC-lint von Gimpel
• Klocwork: bald
• Weitere?
Prüfwerkzeuge für MISRA-C:2012
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 21
© Zühlke 2013
• Wirksam gegen Bugs
Gegenüber MISRA-C:2004 (langfristig):
• Aufwand für Konformität reduziert
• Wechsel des Prüfwerkzeugs erleichtert
MISRA-C:2012 – Ihr Nutzen
MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 22
Fragen? Kommentare? Meinungen? Vernetzen Sie sich mit mir.
Matthias Kraaz