Die Verarbeitungsabfolge ist ein Merkmal des Kontrollflusses. Ihre korrekte Einhaltung ist eine notwendige Eigenschaft sowohl beim Design von Software-Architekturen wie auch beim Design und der Implementierung von Software-Einheiten. Das lässt sich mit CodeSonar einfach überprüfen. Insbesondere das CodeSonar-API eignet sich hervorragend, um Verletzungen bestimmter Reihenfolge-Vorschriften aufzudecken. Auch der als Ergänzung zu CodeSurfer verfügbare Path Inspector ist hier hilfreich: ist eine bestimmte Reihenfolge vorgegeben, liefert er auf die Precedence-Abfrage hin entweder ein Gegenbeispiel, bei dem die Reihenfolge nicht eingehalten wurde, oder er bestätigt die Einhaltung der Vorgabe.
Die ISO 26262 verlangt Sicherheitsanalysen zur Identifikation von Zuständen und Ursachen, darunter Fehler und Ausfälle, die zur Nichteinhaltung einer Sicherheitsvorgabe führen können. In diesem Zusammenhang ist es hilfreich zu wissen, welche Programmteile von der Ausführung einer bestimmten Funktion beeinflusst werden. CodeSurfer kann entsprechende Informationen mit unterschiedlichem Fokussierungsgrad liefern. Das geschieht beispielsweise durch Forward-Slicing – und zwar entweder vom Einsprungpunkt der Funktion aus oder ausgehend von dem Wert, den ein bestimmter Aufruf der Funktion ergeben hat. Mit einem Call-Graph-Viewer kann der Anwender außerdem den von der Funktion ausgehenden Aufrufbaum interaktiv untersuchen. Umgekehrt lässt sich mit dem Backward Slicing von CodeSurfer ermitteln, welche Teile des Programms die Ausführung einer bestimmten Funktion beeinflussen (Bild 1).
In puncto Produktentwicklung schreibt die ISO 26262 vor, dass Maßnahmen getroffen werden müssen, um systematische Ausfälle zu vermeiden. Dabei ist insbesondere ein hierarchisches Design notwendig. Darüber hinaus dürfen die Hard- und Software-Komponenten nicht unnötig komplex sein. In der ISO 26262-6 sind im Einzelnen zehn Design- und Implementierungs-Grundsätze aufgeführt, die sich alle durch CodeSonars integrierte Checks abdecken oder sich individuell mit konfigurierten Checks berücksichtigen lassen, wie Bild 2 verdeutlicht.
Die Komplexität eines Programms lässt sich mit verschiedenen standardisierten Kennzahlen quantifizieren. Beispiele sind die McCabe- und Halstead-Metriken. CodeSurfer kann diverse Metriken berechnen und dokumentieren, und auch CodeSonar wird zukünftig über diese Möglichkeit verfügen. Die Maßzahlen werden auf der Projekt-, Datei- und Funktionsebene errechnet und ermöglichen den Designern damit ein einfaches Einkreisen problematischer Bereiche.
Eingebaute Prüffunktionen des Tools unterstützen verschiedene Arten der Komplexitätsbeschränkung, während sich für andere Restriktionen zusätzliche Checks hinzufügen lassen. Das CodeSonar-API unterstützt auch die Beschränkung der Komplexität logischer oder numerischer Ausdrücke, um die Lesbarkeit und Wartbarkeit des Programms zu verbessern.
Wartbarkeit wird für die Software aller ASILs empfohlen. Gelegentlich ist ein Quellcode schwierig zu verstehen – selbst wenn die zugrundeliegende Semantik im Prinzip recht unkompliziert ist. Aus diesem Grund sucht das Tool den Code nach Konstrukten ab, die die Deutlichkeit beeinträchtigen können. Ein unklarer Kontrollfluss wird hierbei ebenso gemeldet wie syntaktische Komplexität oder verdeckte Zeiger, um nur drei Beispiele herauszugreifen. Darüber hinaus lassen sich in CodeSonar eigene Prüfungen einrichten, um die Verletzung weiterer Komplexitätsbeschränkungen aufzudecken (Bild 3).
Neben zu großer Komplexität sind es unter anderem unbegrenzte Rekursionen oder Schleifen, die der Verifizierbarkeit abträglich sind. Die völlige Abwesenheit unbegrenzter Rekursionen mag sich nicht garantieren lassen, doch verfügt CodeSonar über verschiedene Prüfungen, mit denen sich die Wahrscheinlichkeit für das Auftreten infiniter Rekursionen minimieren lässt. Sollten Rekursionen im Einzelfall komplett untersagt sein, lassen sich Verletzungen dieser Regel ebenfalls mit geeigneten Checks feststellen.
Wünschenswert für die Verifizierbarkeit ist die Fähigkeit zum Testen und Analysieren des Codes – ohne ihn jedoch zu verändern. Beide Software-Tools nutzen deshalb die beim normalen Build-Prozess eines Software-Projekts gewonnenen Informationen zum Erstellen einer internen Darstellung. Diese wird anschließend verschiedenen Analysen unterzogen. Am Produktions-Code selbst müssen dafür keinerlei Modifikationen vorgenommen werden.