Softwareanalyse: den Quellcode lesen
Ein Ansatz, mögliche Schwachstellen in Steuergeräten aufzuspüren, ist die Code- oder Softwareanalyse. „Dabei untersuchen wir den Quellcode mit speziellen Analyseprogrammen, die Fehler und Unstimmigkeiten im Quellcode aufdecken“, berichtet Dirk Johanson, der in Schmerlers Abteilung das Team „Software-Analyse“ leitet.
„Die Codeanalyse erlaubt es, auch in komplexen Quellcodes Fehler aufzuspüren, die sich sonst kaum entdecken lassen.“
Stefan Schmerler, Leiter Methoden und Werkzeuge
In groben Zügen kann man dieses Vorgehen mit einer formalen Textanalyse vergleichen. Ein Text, etwa ein Kochrezept, lässt sich auf unterschiedliche Art und mit unterschiedlichen Wörtern schreiben. Aber für alle Beschreibungen gibt es gültige Grammatik- und Rechtschreibregeln. Nach einem Punkt folgt Großschreibung; Pronomen richten sich nach den entsprechenden Substantiven – es heißt „die Frau und ihr Auto“ und nicht „die Frau und sein Auto“. In heutigen Textverarbeitungsprogrammen sind solche Funktionen meist schon integriert, die den Benutzer auf Rechtschreib- und Syntaxfehler hinweisen oder diese sogar korrigieren.
Codeanalyseprogramme kann man sich ähnlich vorstellen, wobei die Details aber wesentlich komplizierter sind. Der Quellcode für ein Steuergerät würde ausgedruckt Tausende eng bedruckter Seiten füllen – eine für einen einzelnen Menschen unüberschaubare Datenflut. Daher lassen die Softwareprüfer den Quellcode über unterschiedliche Codeanalyseprogramme laufen. „Diese Programme“, erläutert Dirk Johanson, „erkennen eindeutige Programmfehler wie zum Beispiel eine Divison durch Null, aber auch Programmteile, die nie ausgeführt werden, oder falsche Speicherzugriffe.“ Zudem registrieren die elektronischen Helfer verdächtige Stellen, wenn etwa in einem Steuergerät eine Fahrzeuggeschwindigkeit von 350 km/h hinterlegt ist – das ist zwar machbar, bei einem Straßenfahrzeug aber nicht der Fall.
Je nach Analyseziel können die Daimler-Forscher unterschiedliche Tools einsetzen, mit denen sie den Ressourcenverbrauch untersuchen oder nach Laufzeitfehlern fahnden. Beim Abschluss einer Codeanalyse steht eine Liste aller entdeckten Fehler und Unstimmigkeiten zur Verfügung, mit deren Hilfe die Spezialisten anschließend mit der Fehlerbehebung beginnen. „In der Regel machen wir das aber nicht selbst, sondern geben den Softwareentwicklern bei den Zulieferern entsprechende Hinweise zur Fehlerbehebung“, erläutert Stefan Schmerler.
In der Praxis sieht dies oft so aus, dass die Codeanalysten der Daimler-Forschung einige Tage bei dem entsprechenden Zulieferer vor Ort sind, dort mit den „Feuerwehrprogrammen“ die Quellcodes untersuchen und ihre Empfehlungen aussprechen. Die Codes selbst bleiben dabei immer bei den Zulieferern, denn schließlich ist die jeweilige Steuergerätesoftware deren geistiges Eigentum.
Dirk Johanson weist noch auf einen anderen Punkt hin: „Bei einer Codeanalyse wird das Programm, also der Quellcode, lediglich betrachtet und nicht in einem Prüfverfahren ausgeführt. Um den Vergleich mit einem Kochrezept aufzugreifen: Wir prüfen nicht, ob das, was nach dem Rezept gekocht wird, auch schmeckt.“ Durch Funktionalitätstests können nicht alle möglichen Fehlerkombinationen aufgedeckt werden, deshalb wird die Codeanalyse durchgeführt, um zusätzlich die Fehler auch zu lokalisieren. Die Software selbst muss aber in jedem Fall fehlerfrei sein. Spielraum gibt es für die Experten bei einer Codeanalyse deshalb nur bei der Frage, wie exakt dafür die formalen Regeln eingehalten werden müssen. „Die Tools zur Codeanalyse sind wie ein Sieb mit variabler Maschenweite, das wir an den Einzelfall anpassen“, ergänzt Johansons Kollege Steffen Görzig, der in der Abteilung von Bernhard Hohlfeld das Team „Software-Reuse“ leitet.
Einer dieser Fälle war der „Common Powertrain Controller“ (CPC), ein Steuergerät, das bei leichten und schweren Lkw, Bussen und auch im Unimog zum Einsatz kommt.
Da kaum ein Nutzfahrzeug einem anderen gleicht und deshalb auch die Elektronik sehr unterschiedlich ausfällt, muss ein CPC viele Varianten abbilden können und trotzdem zuverlässig mit den rund 30 weiteren Nfz-Steuergeräten kommunizieren. „Es kamen aber immer wieder Laufzeitfehler vor, wobei unbekannt war, wann und wo diese Fehler verursacht wurden“, erinnert sich Steffen Görzig. Weil sich die Fehler nicht reproduzieren ließen, war eine Codeanalyse der sehr umfangreichen Software angesagt, in deren Verlauf die Ursachen gefunden und behoben wurden.