Safety und Security Sicherheitskritische Software: MISRA C++:2023 von A bis Z

Von Michał Rozenau * 6 min Lesedauer

Anbieter zum Thema

MISRA C++:2023 unterstützt Unternehmen, die die Programmiersprache C++ nutzen, bei der Entwicklung sicherheitskritischer Software. Mit dem neuen MISRA-Standard können Entwickler die Anforderungen an die statische Analyse erfüllen, die von funktionalen Sicherheitsnormen wie der ISO 26262 vorgegeben werden, indem sie die MISRA-Konformität ihrer Software-Anwendungen sicherstellen und dokumentieren.

Sicherer Code ist im Automotive-Bereich äußerst wichtig. MISRA C++:2023 unterstützt Unternehmen, die die Programmiersprache C++ nutzen, bei der Entwicklung sicherheitskritischer Software. (Bild:  frei lizensiert von Pixabay)
Sicherer Code ist im Automotive-Bereich äußerst wichtig. MISRA C++:2023 unterstützt Unternehmen, die die Programmiersprache C++ nutzen, bei der Entwicklung sicherheitskritischer Software.
(Bild: frei lizensiert von Pixabay)

AUTOSAR und MISRA haben gemeinsam eine Reihe von Programmierrichtlinien entwickelt, die eine sichere Programmierung mit C++17 ermöglichen. Das veröffentlichte Dokument heißt MISRA C++:2023. Bei MISRA C++ handelt es sich um eine Sammlung von Coding Guidelines, die eine Untermenge der Sprache C++ für den Einsatz in kritischen Systemen definiert, um das Risiko von Fehlern und nicht konformen Programmen zu minimieren.

Der C++ Standard definiert die Sprache nicht vollständig. Es gibt Situationen, in denen das Verhalten undefiniert, nicht spezifiziert oder durch die Implementierung definiert ist. Wenn ein C++-Programm auf solchen Situationen basiert, gibt es keine Garantie, dass es sich vorhersehbar verhält oder portabel ist. Genau hier setzen die MISRA-Richtlinien an – sie helfen, solche Situationen zu erkennen, um die Sicherheit und Zuverlässigkeit der Software zu gewährleisten. Darüber hinaus können konforme Programme so geschrieben sein, dass sie eindeutig auf einen Fehler im Code hinweisen oder mit hoher Wahrscheinlichkeit von den Entwicklern falsch interpretiert werden. Die MISRA-Richtlinien zielen auf solche Fälle ab.

Die Entwicklung von MISRA C++

Die erste Version von MISRA C++ aus dem Jahr 2008 konzentrierte sich auf C++03 und erfreute sich großer Beliebtheit, wurde jedoch durch die Weiterentwicklung von C++ und neue Funktionen in C++11 überholt. Um diese Lücke zu schließen, hat das AUTOSAR-Konsortium im März 2017 die AUTOSAR C++ Guidelines als Teil der Adaptive Platform veröffentlicht.

Jüngstes Kind des MISRA-Standards ist MISRA C++:2023.(Bild:  Parasoft)
Jüngstes Kind des MISRA-Standards ist MISRA C++:2023.
(Bild: Parasoft)

Adaptive AUTOSAR verwendet C++14 als Sprache der Wahl, und die Plattform benötigte einen sicherheitsorientierten Codierungsstandard zur Unterstützung der Entwickler. Etwa 70 Prozent der unveränderten MISRA C++2008 Richtlinien wurden in AUTOSAR C++ übernommen. Mit der kontinuierlichen Weiterentwicklung der Sprache gibt es 17 neue Sprachfeatures für C++, die einen Bedarf an neuen Programmierrichtlinien generierten. MISRA und AUTOSAR beschlossen, die Standards in einer Publikation zusammenzufassen, und MISRA übernahm die Arbeit an der neuen Ausgabe des Standards mit allen notwendigen Aktualisierungen für C++17. Das Ergebnis dieser Arbeit ist das im Oktober 2023 veröffentlichte MISRA C++:2023.

Guidelines und Regeln

MISRA C++:2023 Guidelines werden als Regeln oder Richtlinien (Direktiven) klassifiziert. Regeln sind diejenigen Richtlinien, die eine vollständige Definition von Konformität und Nicht-Konformität enthalten. Bei Richtlinien ist es nicht möglich, die vollständige Beschreibung zu liefern, die für eine Konformitätsprüfung erforderlich ist, weil sie beispielsweise von Design-Entscheidungen abhängt, die im Rahmen eines bestimmten Projekts getroffen werden.

Jede Leitlinie wird einer der folgenden Kategorien zugeordnet:

  • zwingend
  • erforderlich
  • beratend

Regeln/Direktiven werden außerdem nach Entscheidbarkeit und Geltungsbereich klassifiziert.

Zwingende Leitlinien müssen ohne die Möglichkeit einer Abweichung befolgt werden. Von erforderlichen Leitlinien lässt sich abweichen – vorausgesetzt, dass das formale Abweichungsverfahren eingehalten und alle potenziellen Probleme anderweitig gelöst werden. Beratende Leitlinien sind eine Art Empfehlung, die so weit wie möglich befolgt werden sollte.

„Entscheidbarkeit“ definiert, ob die Regel generell durch das automatisierte Werkzeug analysierbar ist oder nicht. „Scope“ stellt dar, ob eine Leitlinie durch die Analyse einer einzelnen Übersetzungseinheit oder des gesamten Systems überprüft werden soll.

Es gibt 179 MISRA C++:2023 Guidelines, vier Direktiven und 175 Regeln, die in Abschnitte gruppiert sind, die den Abschnitten des C++-Standards entsprechen. Das sind:

  • Grundlegende Konzepte
  • Standard-Konvertierungen
  • Ausdrücke
  • Anweisungen
  • Spezielle Member-Funktionen
  • Behandlung von Ausnahmen

Einige dieser Regeln sind von den AUTOSAR-Coding-Guidelines oder dem alten MISRA C++:2008 abgeleitet. Allerdings konzentrierten sich die MISRA-Leitlinien nur auf die Implementierung, während AUTOSAR auch Empfehlungen für das Design, die Toolchain-Infrastruktur oder die Dokumentation lieferte. Im Allgemeinen konzentriert sich MISRA C++:2023 auf die Semantik des Codes und die Vermeidung von Fehlern, ohne zu viele stilistische Vorgaben zu machen.

Konformität mit MISRA C++:2023

Gemäß MISRA C++:2023 müssen die im Compliance-Dokument definierten Konformitätsprozesse eingehalten werden. Dabei handelt es sich um ein separates Dokument, das von den Standards MISRA C und MISRA C++ gemeinsam genutzt wird. Die letzte Version wurde 2020 veröffentlicht und ersetzt die Vorgängerversion von 2016.

Jetzt Newsletter abonnieren

Verpassen Sie nicht unsere besten Inhalte

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung. Die Einwilligungserklärung bezieht sich u. a. auf die Zusendung von redaktionellen Newslettern per E-Mail und auf den Datenabgleich zu Marketingzwecken mit ausgewählten Werbepartnern (z. B. LinkedIn, Google, Meta).

Aufklappen für Details zu Ihrer Einwilligung

Der Parasoft MISRA C2023 Guideline Enforcement Plan.(Bild:  Parasoft)
Der Parasoft MISRA C2023 Guideline Enforcement Plan.
(Bild: Parasoft)

MISRA Compliance enthält eine Sammlung von Anforderungen an den Konformitätsprozess und die Berichterstattung. Es definiert spezifische Berichte, die als Compliance-Artefakte erwartet werden.

  • Der Guideline Enforcement Plan definiert alle technischen Mittel, die zur Durchsetzung der Richtlinien eingesetzt werden.
  • Der Guideline Recategorization Plan beschreibt alle Änderungen an den Richtlinienkategorien, die für das spezifische Projekt eingeführt wurden.
  • Die "Guideline Compliance Summary" dokumentiert den Grad der Konformität mit jeder einzelnen Richtlinie.

Darüber hinaus empfiehlt das Compliance-Dokument ein vollständiges Verfahren für den Umgang mit Abweichungen, das Anforderungen für die Aufzeichnung von Abweichungen, die Verwendung von Abweichungsgenehmigungen und eine Liste von Gründen enthält, aus denen Abweichungen zulässig sind.

Der Parasoft MISRA C2023 Compliance Report.(Bild:  Parasoft)
Der Parasoft MISRA C2023 Compliance Report.
(Bild: Parasoft)

Standardisierte Anforderungen, um die MISRA-Konformität von Projekten zu bestätigen, hilft Unternehmen, ein angemessenes Maß an Vertrauen zu gewährleisten und Konformitätsberichte zu kombinieren, wenn mehrere von Auftragnehmern gelieferte Module integriert werden. Voraussetzung: Für jedes dieser Module wurde eine MISRA C/C++ Code Review durchgeführt.

Einige der Richtlinien ließen sich mit Hilfe des Code-Review-Verfahrens überprüfen, auch wenn das aufwändig ist. Andere, insbesondere diejenigen, die eine Analyse des gesamten Systems erfordern, einschließlich der Richtlinien, die eine Daten- und Kontrollflussanalyse des gesamten Anwendungsquellcodes erfordern, können praktisch nicht manuell geprüft werden. Daher ist es wichtig, automatisierte statische Code-Ananalysewerkzeuge wie Parasoft C/C++Test zu verwenden. Die Werkzeuge bieten eine volle Unterstützung für MISRA C++:2023, um den Code anhand der entsprechenden Richtlinien zu analysieren und die entsprechenden Konformitätsdokumente zu erstellen.

Mit dem Compliance Dashboard als Teil des Reportings erhalten Entwickler und das Management schnellen Überblick über die Konformität der Software. (Bild:  Parasoft)
Mit dem Compliance Dashboard als Teil des Reportings erhalten Entwickler und das Management schnellen Überblick über die Konformität der Software.
(Bild: Parasoft)

MISRA C++:2023 und sichere Software

MISRA C++ zielt darauf ab, eine sichere Untermenge der Sprache C++ zur Verfügung zu stellen. Das wird durch verschiedene Anforderungen und Einschränkungen für den C++ Quellcode erreicht, um die Sicherheit von Anwendungen zu verbessern.

Fehlervermeidung

Der C++-Standard spezifiziert bestimmte Situationen als undefiniertes Verhalten, vor allem, um Compilern die Möglichkeit zu geben, effizienteren Code zu erzeugen. Compiler dürfen davon ausgehen, dass die Situation des undefinierten Verhaltens nie eintritt und aufgrund dieser Annahme zusätzliche Optimierungen vornehmen. Das birgt das Risiko, dass das Verhalten des Programms unvorhersehbar ist, wenn die Situation eintritt. Und in einigen Fällen bedeutet das, dass sich das Programm bei der Testausführung korrekt verhält, aber in der Produktion versagt, was den gesamten Verifikationsprozess sinnlos machen kann. MISRA C++ bietet Richtlinien, die direkt oder indirekt vor undefiniertem Verhalten schützen. Ein Beispiel hierfür ist die Auswertung des unbestimmten Wertes eines Objekts, die durch die „Regel 11.6.2 Der Wert eines Objekts darf nicht gelesen werden, bevor er gesetzt wurde“, verhindert wird.

Wartbarkeit des Codes

Bestimmte Aspekte der abstrakten Maschine werden im C++-Standard als implementierungsdefiniert beschrieben. Das bedeutet, dass das Verhalten des Codes wohldefiniert ist. Es muss dokumentiert werden, dass es sich aber von Implementierung zu Implementierung unterscheiden kann.

Es ist aber nicht einfach ein derartiges Programm auf ein anderes Ziel zu portieren.

Ein Beispiel für ein solches Verhalten ist sizeof(int), das sich auf das Verhalten von arithmetischen Berechnungen auswirkt. Beispielsweise werden alle Operanden mit engeren Typen vor der eigentlichen arithmetischen Operation weitergeleitet. Das kann zu unterschiedlichen Ergebnissen der arithmetischen Operation führen, je nach Kompilierungsziel. Die MISRA C++- Richtlinien vermeiden solche Probleme mit ihren Standard-Konvertierungsregeln.

Risikomanagement

Die MISRA-Richtlinien behandeln auch eine Reihe potenzieller Risiken, die durch Verwirrung oder falsches Verständnis des Entwicklers über gültigen C++-Quellcode entstehen können. Beispielsweise ist der Code if (x = y) durchaus gültiger C++-Code, aber höchstwahrscheinlich das Ergebnis eines Tippfehlers, bei dem versehentlich der Zuweisungsoperator anstelle des Gleichheitsoperators verwendet wurde. Die „Regel 8.18.2 Das Ergebnis eines Zuweisungsoperators darf nicht verwendet werden“ stellt sicher, dass ein solcher Code gemeldet und auf Korrektheit überprüft wird.

Fazit

Die Verwendung vernünftiger Programmierrichtlinien und einer sicheren Sprachuntermenge wird von den Standards für funktionale Sicherheit nicht ohne Grund gefordert. Unternehmen, die die Einhaltung von MISRA C++:2023 vorweisen können, verbessern die Sicherheit ihrer C++-Anwendungen.  (se)

* Michał Rozenau ist aktives Mitglied der MISRA C und MISRA C++ Arbeitsgruppen und Projektingenieur bei Parasoft.

(ID:49957829)