Dazu kommt, dass die Definition, was ein korrektes C-Programm ist, der Flexibilität zuliebe sehr liberal ausfällt. Es gibt daher zahlreiche Mehrdeutigkeiten, die vom Compiler interpretiert und aufgelöst werden müssen. »Viele Entwickler sind zudem überrascht, wenn sie erfahren, dass undefiniertes Verhalten eines C-Programms nicht gegen den Standard verstößt. Überspitzt gesagt: Es ist völlig in Ordnung, wenn das Programm irgendwas tut«, berichtet Hermeling. »C99 etwa nennt 191 Varianten von undefiniertem Verhalten. In der Regel versucht der Compiler in diesem Fall, das wahrscheinlich Sinnvollste zu tun. Sofern der Compiler das Problem erkennt.« Auch nichtspezifiziertes Verhalten eines C-Programms sei aus Sicht des Standards okay – in diesem Fall böte der Standard eine Auswahl an Möglichkeiten, die Situation aufzulösen. Es liegt am Compiler, welche Lösung genutzt wird. »Aus Sicht der funktionalen Sicherheit ist das nicht ideal, Programmierfehler können extrem leicht gemacht und oft nur schwer erkannt werden«, betont Hermeling. »Programmierstandards wie MISRA C/C++ in der Automobilbranche oder DO178-B/C in der Luftfahrt nehmen sich dieses Problems an, indem sie zahlreiche Regeln aufstellen, wie bei der Entwicklung vorzugehen ist.«
Um nicht nur Programmierfehler und potenzielle Sicherheitslücken frühzeitig bei der Entwicklung aufzudecken, sondern auch die Einhaltung dieser Regeln und Best Practices zu gewährleisten, bietet sich die statische Code-Analyse an. Bei der statischen Code-Analyse wird die Software nicht wie beim Testen dynamisch durchlaufen. Die Analyse basiert auf einem Modell, das vom Analyse-Tool anhand des Quellcodes erzeugt wird. Die statische Analyse untersucht das Modell mittels „Checkern“ auf Fehler, Schwachstellen und Abweichungen von definierten Programmierstandards. Buffer-Overruns, Null-Pointer-Dereferenzierungen oder Zugriffe auf potenziell unsichere Datenquellen können so erkannt und frühzeitig behoben werden. Dazu muss kein lauffähiger Code vorliegen. Das Vorgehen ähnelt der Arbeitsweise eines Compilers: Aus den geparsten Quellen erzeugt das Analyse-Tool die Intermediate Representation (IR). Während ein Compiler aus der IR den Objektcode erzeugen würde, nutzt die statische Analyse die IR, um alle Daten- und Steuerungsflüsse durch das Programm zu untersuchen. Damit findet die statische Analyse auch Probleme, die beim dynamischen Testen eventuell unentdeckt bleiben, da sie den Ausgang der Testfälle nicht beeinflussen.
Eine Besonderheit bei der statischen Analyse stellt das Tool CodeSonar von GrammaTech dar: CodeSonar kann auch Dateien analysieren, die nur binär vorliegen und deswegen nicht einfach in eine IR überführt werden können. Das betrifft vor allem Code von Zulieferern, der zwar immer mehr auch in der Embedded-Entwicklung eingesetzt wird, aber nur extrem schwer auf Bugs oder andere Qualitätsprobleme hin untersucht werden kann.
Für die Entwicklung sicherheitsrelevanter Systeme spielt die Automatisierung der Code-Analyse eine wichtige Rolle. Durch eine möglichst durchgängige Automatisierung der Entwicklung und vor allem der Qualitätssicherung lassen sich die Risiken, die von einem sicherheitskritischen System ausgehen, signifikant reduzieren. Denn jeder manuelle Eingriff stellt eine potenzielle Fehlerquelle dar. Der positive Effekt steigt mit der Risikoklasse deutlich an. Dabei kann ein Analyse-Tool wie CodeSonar direkt am Arbeitsplatz des Entwicklers zum Einsatz kommen, um Fehler in den täglichen Integrations noch vor dem lokalen Test-Build zu erkennen und zu beheben. Gleichzeitig kann die statische Analyse in das Build-System integriert werden und dort eine zusätzliche Schicht zur Fehlerminimierung bilden. Hier ist die statische Code-Analyse dem dynamischen Testen vorgelagert. Gleichzeitig hilft die statische Analyse bei den unverzichtbaren Reviews, die über den Lebenszyklus eines Embedded-Systems hinweg gemacht werden müssen.
So erfüllt die statische Analyse die zentralen Anforderungen der IEC 61508: Fehler soweit wie möglich zu vermeiden, etablierte Programmierstandards umzusetzen und gleichzeitig die Einhaltung der in der Norm beschriebenen Verfahren und Methoden zuverlässig zu dokumentieren.
Dabei muss allerdings klar sein, dass der Einsatz eines Tools zur statischen Analyse für sich genommen noch keine Compliance erzeugt. Das Tool dient vielmehr dem Nachweis der Compliance. Im Falle der ISO 26262 adressiert die statische Analyse zahlreiche Anforderungen aus Abteilung 6 der Norm, die sich mit der funktionalen Sicherheit auf Software-Ebene befasst. Zum Nachweis der Compliance ist es hilfreich, wenn das entsprechende Analyse-Tool wie im Falle von CodeSonar für die Verifizierung von Software in sicherheitsrelevanten Systemen nach den höchsten Sicherheitsanforderungen von IEC 61508 und ISO 26262 zertifiziert wurde.
Grammatech, Halle 4, Stand 423