MISRA-C:2012
Matthias Kraaz
Können Sie C?
printf("%d", 4 + 1 % 5);
/* Ausgabe: 5 */

uint32_t a = 1;
int32_t b = -1;
if(a < b)
{
printf("Ups");
}
/* A...
Können Sie C?
printf("%d %d", i++, i);
/* Unspezifiziert: 0 0 oder 0 1 */
int a = 128;
printf("%d", a + a);
/* Plattformab...
Können Sie C?
int x = 2;
int flag = 0;
switch(x)
{
case 1:
if(flag)
{
case 2:
printf("Ups");
}
break;
}
/* Ausgabe: Ups */...
Probleme von C
•

Verwirrend kompliziert

•

Teilweise unspezifiziert – Compiler reagiert „flexibel“

•

Teilweise plattfo...
MISRA-C:2012
•

Programmierrichtlinie für C90 und C99

•

Veröffentlichung März 2013

•

Vorgänger: MISRA-C:1998, MISRA-C:...
16 Direktiven
•

Plattform-Spezifika verstanden und dokumentiert

•

Traceability auf Anforderungen

•

Defensive Programm...
143 Regeln
•A

standard C environment

• Unused

Code

• Comments
• Character

sets

•

Expressions

•

Side effects

•

C...
Was meint MISRA-C dazu?
printf("%d", 4 + 1 % 5);
/* Regel 12.1: Reihenfolge mit Klammern verdeutlichen! */
uint32_t a = 1;...
Was meint MISRA-C dazu?
printf("%d %d", i++, i);
/* Regel 13.2: Keine unspezifizierten Ergebnisse! */
int a = 128;
printf(...
Was meint MISRA-C dazu?
int x = 2;
int flag = 0;
switch(x)
{
case 1:
if(flag)
{
case 2:
printf("Ups");
}
break;
}
/* Kapit...
Änderungen gegenüber MISRA-C:2004
•

Endlich auch C99 unterstützt

•

Präziser formuliert

•

Besser automatisiert prüfbar...
„Funktionen statt Makros“
Alt (MISRA-C:2004)
•

Automatisierte Prüfung:
Anwarnung aller Makros mit Parametern

•

Folge: G...
„Fehlercodes abtesten“
Alt (MISRA-C:2004)
•

Automatisierte Prüfung:
Anwarnung aller nicht verwendeten Rückgabewerte

•

F...
Klammerung – Alt (MISRA-C:2004)
Rule 12.1 (advisory): Limited dependence should be placed on C’s operator
precedence rules...
Klammerung – Neu (MISRA-C:2012)
Rule 12.1

The precedence of operators within expressions should be made explicit

Categor...
„Kein unerreichbarer Code“
Alt (MISRA-C:2004)
•

Regel: Kein unerreichbarer Code (½ Seite)

•

Sehr uneinheitliche Umsetzu...
„Kein goto“
Alt (MISRA-C:2004)
•

Regel: Kein goto

•

Wunderbar prüfbar

•

Folge: Manchmal wurde goto trotzdem verwendet...
War Story
•

Int. Konzern wechselt von Prüfwerkzeug A auf B

•

Pilotprojekt mit ~ 100.000 Zeilen Code

•

Plötzlich ~ 5.0...
Erwartung Illusion Hoffnung
•

Harmonisierung der Ergebnisse verschiedener
Prüfwerkzeuge

•

Implementation aller Regeln w...
Prüfwerkzeuge für MISRA-C:2012
•

LDRArules von LDRA

•

QA-C von Programming Research

•

PC-lint von Gimpel

•

Klocwork...
MISRA-C:2012 – Ihr Nutzen
•

Wirksam gegen Bugs

Gegenüber MISRA-C:2004 (langfristig):
•

Aufwand für Konformität reduzier...
Fragen? Kommentare? Meinungen?
Vernetzen Sie sich mit mir.

Matthias Kraaz
Nächste SlideShare
Wird geladen in …5
×

MISRA-C 2012 (ESE-Kongress 2013)

2.924 Aufrufe

Veröffentlicht am

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.

Veröffentlicht in: Technologie
0 Kommentare
1 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

Keine Downloads
Aufrufe
Aufrufe insgesamt
2.924
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
1.639
Aktionen
Geteilt
0
Downloads
26
Kommentare
0
Gefällt mir
1
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

MISRA-C 2012 (ESE-Kongress 2013)

  1. 1. MISRA-C:2012 Matthias Kraaz
  2. 2. Können Sie C? printf("%d", 4 + 1 % 5); /* Ausgabe: 5 */ uint32_t a = 1; int32_t b = -1; if(a < b) { printf("Ups"); } /* Ausgabe: Ups */ MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 2 © Zühlke 2013
  3. 3. Können Sie C? 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 */ MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 3 © Zühlke 2013
  4. 4. Können Sie C? int x = 2; int flag = 0; switch(x) { case 1: if(flag) { case 2: printf("Ups"); } break; } /* Ausgabe: Ups */ MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 4 © Zühlke 2013
  5. 5. Probleme von C • Verwirrend kompliziert • Teilweise unspezifiziert – Compiler reagiert „flexibel“ • Teilweise plattformabhängig • Teilweise undefiniert – Absturz oder irgendwas anderes MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 5 © Zühlke 2013
  6. 6. 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
  7. 7. 16 Direktiven • Plattform-Spezifika verstanden und dokumentiert • Traceability auf Anforderungen • Defensive Programmierung • Fehlercodes abtesten • Lieber Funktionen statt Makros • Gut lesbare Bezeichner • Keine dynamische Speicherverwaltung • … MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 7 © Zühlke 2013
  8. 8. 143 Regeln •A standard C environment • Unused Code • Comments • Character sets • Expressions • Side effects • Control statement expressions • Control flow • Switch statements • Identifiers • Functions • Types • Pointers and arrays • Literals and constants • Overlapping storage • Preprocessing directives • Standard Libraries • Declarations and definitions • Initialization • Resources • Pointer type conversions • … MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 8 © Zühlke 2013
  9. 9. Was meint MISRA-C dazu? 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! */ MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 9 © Zühlke 2013
  10. 10. Was meint MISRA-C dazu? 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! */ MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 10 © Zühlke 2013
  11. 11. Was meint MISRA-C dazu? int x = 2; int flag = 0; switch(x) { case 1: if(flag) { case 2: printf("Ups"); } break; } /* Kapitel Switch Statements: so nicht! */ MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 11 © Zühlke 2013
  12. 12. Änderungen gegenüber MISRA-C:2004 • Endlich auch C99 unterstützt • Präziser formuliert • Besser automatisiert prüfbar • Kaum Änderung des Umfangs • Kaum Änderung der Intention der Regeln MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 12 © Zühlke 2013
  13. 13. „Funktionen statt Makros“ 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 MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 13 © Zühlke 2013
  14. 14. „Fehlercodes abtesten“ 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 MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 14 © Zühlke 2013
  15. 15. Klammerung – Alt (MISRA-C:2004) 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 */ MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 15 © Zühlke 2013
  16. 16. Klammerung – Neu (MISRA-C:2012) 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 A + B + C /* OK */ A + B - C /* OK */ A + B / C /* Warnung */ A – B – C /* OK */ A + (B + C) /* OK */ MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 16 © Zühlke 2013
  17. 17. „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
  18. 18. „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
  19. 19. 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 MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 19 © Zühlke 2013
  20. 20. 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
  21. 21. Prüfwerkzeuge für MISRA-C:2012 • LDRArules von LDRA • QA-C von Programming Research • PC-lint von Gimpel • Klocwork: bald • Weitere? MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 21 © Zühlke 2013
  22. 22. MISRA-C:2012 – Ihr Nutzen • Wirksam gegen Bugs Gegenüber MISRA-C:2004 (langfristig): • Aufwand für Konformität reduziert • Wechsel des Prüfwerkzeugs erleichtert MISRA-C:2012 | Matthias Kraaz 3. Dezember 2013 Folie 22 © Zühlke 2013
  23. 23. Fragen? Kommentare? Meinungen? Vernetzen Sie sich mit mir. Matthias Kraaz

×