MISRA-C 2012 (ESE-Kongress 2013)

23
MISRA-C:2012 Matthias Kraaz

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.

Transcript of MISRA-C 2012 (ESE-Kongress 2013)

Page 1: MISRA-C 2012 (ESE-Kongress 2013)

MISRA-C:2012 Matthias Kraaz

Page 2: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 3: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 4: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 5: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 6: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 7: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 8: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 9: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 10: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 11: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 12: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 13: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 14: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 15: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 16: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 17: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 18: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 19: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 20: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 21: MISRA-C 2012 (ESE-Kongress 2013)

© 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

Page 22: MISRA-C 2012 (ESE-Kongress 2013)

© 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