Blog

MISRA C 2012 vs. MISRA C2 – So gelingt der Umstieg

August 17, 2021
Secure Code Warrior
Code-Ausschnitt mit OpenGL-Befehlen zum Erstellen eines Shaders, Festlegen der Farbe und Zeichnen von Dreiecken.

Bei Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Embedded-Entwickler und Sicherheitsverantwortliche bei der Erstellung sicherer eingebetteter Systeme zu unterstützen, erschließen wir das Feld der Sicherheit für eingebettete Systeme. In diesem Beitrag sprechen wir über den Standard MISRA C 2012 und warum dessen Einhaltung für den Aufbau sicherer eingebetteter Systeme notwendig ist.

Beim Programmieren in C ist es sehr leicht, Dinge zu implementieren, die zwar richtig aussehen, aber grundlegend falsch sind. Ihr Code lässt sich möglicherweise problemlos kompilieren und läuft sogar eine Zeit lang einwandfrei. Doch derselbe Code könnte abstürzen oder undefiniertes Verhalten zeigen, wenn die Eingabegröße oder der Speicherbedarf zunimmt. Ein Beispiel hierfür ist eine bestimmte Eingabezahl, die zu einem Integer-Überlauf führt, oder eine bestimmte Zeichenfolge, die einen Array-Index außerhalb der Grenzen verursacht.

Hier kann der MISRA C-Codierungsstandard helfen. Die im Standard festgelegten Regeln, Richtlinien und Best Practices ermöglichen es Entwicklern, sicheren und zuverlässigen C-Code für die Embedded-Entwicklung zu schreiben.

MISRA C 2012, die neueste Version des Standards, fügt neue Regeln hinzu, verbessert bestehende und behebt einige Unstimmigkeiten. Wenn Sie noch eine ältere Version verwenden, ist jetzt ein guter Zeitpunkt für den Umstieg.

Was ist der MISRA C-Codierungsstandard?

Der MISRA C-Standard enthält Richtlinien für Codesicherheit, Portabilität und Zuverlässigkeit für die Programmiersprache C. Die erste Reihe von Richtlinien wurde 1998 veröffentlicht und war spezifisch auf die Sprache C ausgerichtet.

Seitdem entwickelt das MISRA-Konsortium jedoch auch Codierungsstandards für C++. Jedes MISRA C-Dokument enthält eine Reihe von Regeln, Beispiele für nicht konformen Code sowie detaillierte Abschnitte mit Hintergrundinformationen, die zur Entwicklung dieser Regeln beigetragen haben.

C und C++ sind die am weitesten verbreiteten Sprachen für die Entwicklung eingebetteter Software. Einer der Hauptgründe dafür ist ihre Geschwindigkeit, da sie nur ein oder zwei Abstraktionsebenen über der Maschinensprache liegen. Dies bedeutet jedoch auch, dass das Schreiben von sicherem Code, insbesondere in C, schwierig und fehleranfällig ist. In den meisten Hochsprachen wie Java oder C# müssen Sie sich beispielsweise nicht um triviale Dinge wie Garbage Collection oder dynamische Typisierung kümmern.

In C gibt es jedoch keine vordefinierte Methode zur Garbage Collection. Wenn Sie Speicher für eine Datenstruktur reservieren, müssen Sie diesen manuell wieder freigeben, sobald Sie ihn nicht mehr benötigen. Wenn Sie dies nicht tun, wird der Speicher – anders als in anderen Sprachen – nicht automatisch freigegeben, was zu einem Speicherleck führt.

MISRA C 2004 (C2) vs. MISRA C 2012 (C3) – Was hat sich geändert?

MISRA C: 2012, auch bekannt als C3, wurde erstmals im April 2013 veröffentlicht. Basierend auf dem Wissen tausender Experten und Organisationen fügt C3 neue Regeln hinzu, verbessert die Erklärungen und Hintergründe einiger bestehender Regeln und schließt einige Lücken.

C3 unterstützt die C99-Version der Sprache und behält gleichzeitig die Regeln für das ältere ISO C90 bei. Der Hauptfokus von C3 lag darauf, den üblichen Aufwand für die Regeldurchsetzung zu reduzieren und gleichzeitig die Verwendung der Sprache C in kritischen Systemen sicherer zu machen. All dies macht es ratsam, auf den neuen Standard umzusteigen, falls Sie dies noch nicht getan haben.

Hier ist eine Liste der wichtigsten Änderungen:

  • Behebung von Problemen, die in der Version 2004 gefunden wurden.
  • Signifikante Erhöhung der Anzahl entscheidbarer Regeln. Eine Regel ist entscheidbar, wenn ein Analysetool dabei helfen kann, die Konformität zu bestimmen.
  • Regeln werden in „erforderlich“ (required), „empfohlen“ (advisory) oder „zwingend“ (mandatory) kategorisiert. Zwingende Regeln dürfen unter keinen Umständen gebrochen werden. Erforderliche und empfohlene Regeln können in speziellen Szenarien verletzt werden, sofern die Abweichung begründet ist.
  • Hinzufügen von Anleitungen zur Anwendung von Regeln auf automatisch generierten Code. Dies ist sehr wichtig, da die Richtlinien für von Menschen geschriebenen Code nicht immer auf maschinell generierten Code anwendbar sind.
  • Entfernung übermäßig verallgemeinerter Regeln, die ein vernünftiges Benutzerverhalten untersagten. Früher wurde beispielsweise empfohlen, Makros überhaupt nicht zu verwenden, da sie zu verschiedenen Schwierigkeiten und Verwirrung führen können (Makros sind nicht debuggbar, haben keine Namespaces etc.). Dies verhinderte die Verwendung von Makros selbst in Situationen, in denen sie eine elegante, sichere und bequeme Lösung hätten bieten können. In MISRA C: 2012 wurden neue Regeln für Makros eingeführt, die deren sorgfältige Verwendung ermöglichen, wann immer dies angebracht ist. Siehe den folgenden Auszug aus einem MISRA C-Dokument, der die Verwendung eines Makros gegenüber einer Funktion empfiehlt.
Text excerpt about using macros in MMMC tool to implement integrators and suppress warnings with code example.

MISRA C-Regeln in der Praxis

Genug der Theorie, jetzt ist es an der Zeit, sich mit einigen MISRA C-Regeln praktisch auseinanderzusetzen und zu sehen, wie sie angewendet werden.

Verwenden Sie kompatible Typen als Zeigerargumente für memcpy, memmove und memcmp

Die Standardbibliotheksfunktionen memcpy, memmove und memcmp führen ein Byte-für-Byte-Verschieben oder einen Vergleich der angegebenen Anzahl von Bytes durch. Regel 21.15 des MISRA C 2012-Standards schreibt vor, dass die beiden Funktionsparameter Zeiger auf denselben Typ sein müssen. Ein Funktionsaufruf mit inkompatiblen Zeigertypen könnte auf einen Fehler hindeuten.

Betrachten Sie das folgende Bild aus dem offiziellen MISRA-Compliance-Dokument. Die Regel ist erforderlich, entscheidbar und gilt sowohl für C90 als auch für C99.

Screenshot of MISRA C Rule 21.15

Ein Beispiel folgt auf die Regelbeschreibung.

Screenshot of a non-compliant solution.

Wie Sie sehen können, handelt es sich hierbei um eine nicht konforme Lösung, da die Objekte unterschiedliche Typen (uint8_t und uint16_t) aufweisen.

String-Verarbeitungsfunktionen ohne Längenangabe dürfen nicht zu Speicherzugriffsfehlern führen

String-Verarbeitungsfunktionen aus <string.h>, die keine Längenangabe als Eingabe erfordern, sollten nicht zu Speicherzugriffsfehlern führen. Die relevanten Funktionen sind: strcat, strchr, strcmp, strcoll, strcpy, strcspn, strlen, strpbrk, strrchr, strspn, strrstr und strtok. Die Regel ist zwingend, was bedeutet, dass sie unter keinen Umständen verletzt werden darf. Sie gilt sowohl für C90 als auch für C99 und ist nicht entscheidbar.

Screenshot of MISRA C rule 21.17.

Das entsprechende Beispiel lautet:

Screenshot of a correct example of string handling functions

Wie Sie sehen, kopiert strcpy in Funktion f1 über die Länge des Strings hinaus, der nur 5 Zeichen aufnehmen kann. Wir haben auch eine konforme und sichere Verwendung von strcpy, bei der der String nur kopiert wird, wenn der Inhalt von „str“ hineinpasst.

Extern empfangene Daten validieren

Dir 4.14 empfiehlt, die Gültigkeit von Daten zu überprüfen, die aus „externen“ Quellen empfangen werden. Externe Eingaben können sein:

  • Lesevorgänge aus einer Datei.
  • Lesevorgänge aus einer Umgebungsvariablen.
  • Jegliche Benutzereingaben.
  • Alles, was über einen Kommunikationskanal empfangen wird, z. B. über eine TCP-Verbindung oder eine HTTP-API usw.

Diese Richtlinie fällt in die Kategorie erforderlich und ist sowohl auf C90 als auch auf C99 anwendbar. Der Grund dafür ist, dass ein Programm keine Kontrolle über Daten hat, die von externen Quellen empfangen werden, was bedeutet, dass diese Daten ungültig oder bösartig sein können. Ein Programm erwartet beispielsweise, dass ein Benutzer eine Zahl eingibt, der Benutzer gibt jedoch einen String ein. Vor der Verarbeitung der Eingabe muss das Programm überprüfen, ob es sich tatsächlich um eine Zahl handelt.

Validity Of Values Received From External Sources Shall Be Checked

So stellen Sie auf MISRA C 2012 um

Die Umstellung auf MISRA C 2012 erfordert eine Aktualisierung Ihres Dokuments mit den Programmierrichtlinien. Wenn Sie kein solches Dokument verwenden und sich stattdessen auf ein statisches Analysetool verlassen (was die empfohlene Wahl ist), müssen Sie möglicherweise eine neuere Version des Tools erwerben. Hier sind drei Tools, die auf MISRA C 2012-Konformität prüfen:

  1. Cppcheck ist ein Open-Source-Tool, das auf MISRA-Regeln prüfen und verschiedene Arten von Fehlern erkennen kann.
  2. PC-lint Plus ist ein kostenpflichtiges Tool mit einer 30-tägigen Testphase. Neben der Prüfung auf MISRA C-Konformität hilft es auch dabei, potenzielle Fehler und Schwachstellen zu identifizieren.
  3. CodeSonar ist ein weiteres Tool, das sowohl auf MISRA C- als auch auf C++-Konformität prüft.

Es gibt auch einige Compiler, die auf MISRA-Konformität testen können. Falls ein Regelverstoß erkannt wird, werden entsprechende Warnungen oder Ausnahmen ausgelöst. So bietet beispielsweise Green Hills Software Compiler mit Unterstützung für alle MISRA-Standards für 32-Bit- und 64-Bit-Architekturen an.

Verwendung von Secure Code Warrior zur Weiterbildung von Entwicklern in MISRA C

Das Flaggschiff-Produkt von Secure Code Warrior – unsere Lernplattform – bietet zahlreiche interaktive Challenges, Kurse und Assessments, die Entwickler dabei unterstützen, sicheren C/C++-Code zu schreiben. Die Inhalte sind frameworkspezifisch und hochgradig motivierend. Unsere C/C++:Embed-Coding-Challenges basieren auf MISRA C, AUTOSAR C++ (MISRA C++) und IEC-Standards.

Entwickler können personalisierte Lernpfade einschlagen, in denen sie C/C++-spezifische Schwachstellen identifizieren und vor allem lernen, diese Fehler zu beheben. Dabei können sie ihren Fortschritt verfolgen, Schwächen erkennen und sich in freundschaftlichen Coding-Wettbewerben mit Kollegen messen. Erfahren Sie mehr darüber, wie wir die Automobil- und Transportbranche mit unseren Lösungen unterstützen.

Möchten Sie sehen, wie interaktiv und praxisnah unsere Challenges sind? Probieren Sie einige C/C++:Embed-Challenges noch heute auf unserer Lernplattform aus!

Slogan

Kontrollieren Sie KI-gestützte Entwicklung, bevor sie in Produktion geht

Bewerten Sie KI-gestützte Risiken, setzen Sie Richtlinien für sicheren Code direkt beim Commit durch und beschleunigen Sie die sichere Bereitstellung über Ihren gesamten SDLC hinweg.

Demo buchen
Ressourcenbibliothek

Weitere Blogs entdecken

Erhalten Sie Zugang zu Experteninhalten über sichere Programmierung, KI-Governance und Software-Risikomanagement.

alle anzeigen
Fallstudie
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Mehr erfahren
Fallstudie
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

Mehr erfahren
Fallstudie
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Eine Sicherheitskultur: Wie Sage sein Champions-Programm aufgebaut hat

Erfahren Sie, wie Sage die Sicherheit durch einen flexiblen, beziehungsorientierten Ansatz gestärkt, über 200 Security Champions ausgebildet und eine messbare Risikoreduzierung erzielt hat.

Mehr erfahren
Blog
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Cybersecurity Awareness Month 2026: Das Verständnis von KI-Sicherheit ist entscheidend für die Unternehmensverteidigung

Wir haben einen Punkt erreicht, an dem die meisten führenden KI-Unternehmen öffentlich eine weltweite Verlangsamung der KI-Entwicklung gefordert haben, damit die Sicherheitsvorkehrungen Schritt halten können. Doch die Wahrheit ist: Ernsthafte Sicherheitsprobleme sind bereits Realität geworden. Dies bringt unzählige Sicherheitsverantwortliche und Führungsteams in eine dringliche Lage, da die finanziellen Kosten und Risiken durch die Implementierung von KI stetig steigen.

Mehr erfahren
Blog
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Enabler 8: Branding für Ihr Programm

Ein Programm für sicheres Programmieren braucht mehr als nur großartige Inhalte, um erfolgreich zu sein. Enabler 8 zeigt, wie Branding die Teilnahme zu einem begehrten, statusorientierten Erlebnis macht.

Mehr erfahren
Blog
Filterbezeichnung
Dies ist ein Text innerhalb eines Div-Blocks.

Jeder Mitarbeiter steht jetzt an vorderster Front der KI-Cybersicherheit

Die Unternehmenslandschaft wandelt sich mit einer Geschwindigkeit, die kaum jemand vorhergesehen hat, bis es zu spät war. Wir haben offiziell die Schwelle von handgeschriebenem Code und einfacher Copilot-Unterstützung hin zur Ära des Agentic Development Lifecycle (ADLC) überschritten. Während autonome KI-Agenten eine beispiellose Effizienz in vielen Bereichen versprechen, bringen sie auch eine völlig neue Klasse von Sicherheits- und Regulierungsrisiken mit sich.

Mehr erfahren

Sichere KI-gestützte Entwicklung vor dem Release

Erkennen Sie Entwicklerrisiken, setzen Sie Richtlinien durch und verhindern Sie Schwachstellen über den gesamten Softwareentwicklungszyklus hinweg.

Demo buchen
Keine Elemente gefunden.