Sichere Software für Embedded-Systeme

Mensch und Maschine müssen sich ergänzen

27. Februar 2019, 10:41 Uhr | von Richard Bellairs, Product Marketing Manager von Perforce Software, und Andreas Sczepansky, CEO von QA Systems
Diesen Artikel anhören

Fortsetzung des Artikels von Teil 1

Automatisierte Softwarelösungen

Um sowohl Geschwindigkeit als auch Qualität miteinander in Einklang zu bringen, empfiehlt sich die Unterstützung der manuellen Prüfprozesse durch automatisierte Softwarelösungen, die menschliche Reviewer von Teilen ihrer Aufgaben entlasten und damit sowohl die Qualität der Review-Prozesse erhöhen als auch deren Dauer beschleunigen können. Unterteilen lassen sich die entsprechenden Lösungen in jene für dynamisches Testen und jene für statische Codeanalyse.

Beim dynamischen Code-Testing wird der Quelltext zunächst zu einem lauffähigen Programm kompiliert und anschließend während der Ausführung geprüft. Der Vorteil dieser Methode besteht darin, dass das Verhalten der Software so im Realbetrieb untersucht werden kann. Entsprechend lassen sich Leistungsprobleme identifizieren oder die tatsächliche Umsetzung von zu Beginn definierten Anforderungen (Requirements) im finalen Softwareprodukt überprüfen. Dazu benötigen die entsprechenden Tools jedoch ihrerseits eigens entwickelte Testszenarien, deren Qualität zu einem hohen Maß die Qualität und Aussagekraft des Testergebnisses bedingt. Darüber hinaus besteht die Gefahr, dass diese auch ihrerseits Fehler enthalten können. Capers Jones kommt in seinem Paper „Software Defect Origin and Removal Methods“ zu dem Ergebnis, dass dies bei etwa sechs Prozent der Testcases der Fall ist. Im schlimmsten Fall wiegen sich Entwickler und Hersteller dann in trügerischer Sicherheit.

Darüber hinaus besteht die Gefahr, dass enthaltene Fehler in dynamischen Testprozessen überhaupt nicht ans Tageslicht kommen, da der entsprechende Sonderfall nicht in den Testszenarien berücksichtigt wurde. Ressourcenbedingt ist es in der Praxis schlicht nicht machbar, jeden möglichen Ausführungspfad einer Software oder jede mögliche Eingabe eines Anwenders durchzuspielen. Der Software-Engineering-Experte Roger Pressman errechnet in seinem Buch „Software Engineering: A Practitioner’s Approach“, dass bei einem kleinen Programm aus gerade einmal hundert Zeilen mit einigen Verschachtelungen und einer Schleife, die weniger als zwanzig Mal ausgeführt wird, bereits 1014 Möglichkeiten bestehen, ausgeführt zu werden. Selbst wenn es möglich wäre, für jeden dieser Fälle einen Testcase zu entwickeln, und jeder Testcase in einer Millisekunde ausgeführt werden könnte, würde es 3170 Jahre dauern, um das Programm vollständig zu testen.

Demgegenüber steht die Möglichkeit der statischen Codeanalyse. Hier lässt sich der Softwarecode bereits in Quelltextform auf Fehler prüfen, ohne dass dafür im ersten Schritt ein lauffähiges Programm erstellt werden muss. Die entsprechenden Tools erzeugen auf Basis des Quellcodes ein akkurates Verhaltensmodell der Software und sind damit in der Lage, beispielsweise Variablen mit den Werten nachzuverfolgen, die diese jeweils zur Laufzeit erhalten würden. Die statische Codeanalyse erfolgt daher parallel zum Verfassen des Codes, nicht erst während der eigentlichen Testphase. Werden entsprechend Schwachstellen im Code entdeckt, lassen sich die jeweiligen Stellen exakt bestimmen und enthaltene Fehler unmittelbar beheben, bevor diese zu Bugs in der Testphase führen und aufwändig rückverfolgt sowie behoben werden müssen. Für Hersteller ein zentraler Vorteil, denn die Kosten zur Behebung von Fehlern wachsen exponentiell mit dem Fortschreiten der Entwicklung – ganz zu schweigen davon, dass sie im Produktivbetrieb zu Sicherheitslücken werden können.

Gleichzeitig lassen sich auf diese Weise auch die Einhaltung von Coding-Standards und Compliance-Vorschriften für spezialisierte Branchen wie Medizintechnik oder Automotive sicherstellen – für letztere beispielsweise der Programmierstandard MISRA oder die ISO-Norm 26262 für funktionale Sicherheit in Fahrzeugen. Dazu wird der jeweilige Quellcode gegen die entsprechenden Kodierungsregeln geprüft und die Einhaltung der vorgegebenen Standards im Quelltext untersucht. Da mithilfe der statischen Analyse mehrere zehntausend Quelldateien in nur wenigen Minuten gescannt werden können, lässt sich dies deutlich schneller bewerkstelligen als durch menschliche Prüfer. Darüber hinaus unterlaufen der statischen Codeanalyse keine Aufmerksamkeitsfehler, sodass die Einhaltung der Standards bei Bedarf jederzeit nachgewiesen werden kann.

Bei allen Vorteilen ist die statische Codeanalyse jedoch nicht in der Lage, den intendierten Sinn eines Codeteils zu prüfen, also ob die entsprechende Funktion tatsächlich das tut, was der Entwickler damit beabsichtigt hat. Soll eine Funktion beispielsweise eine Fläche berechnen und der Entwickler addiert hierzu Länge und Breite (anstatt sie zu multiplizieren), wird die statische Codeanalyse keinen Fehler erkennen, solange die verwendeten Variablen auf technischer Ebene keinen Buffer-Overflow erzeugen. Dazu kommen Coding-Standards, die der subjektiven Interpretation unterliegen und nicht objektiv geprüft werden können, etwa die Vorgabe CERT-C MSC04, die die Verständlichkeit von Kommentaren betont. Insgesamt kann eine statische Codeanalyse laut Capers Jones etwa 65 Prozent Effizienz erreichen. Einen vollständigen Ersatz für einen menschlichen Prüfer stellen damit auch diese Tools nicht dar. Jedoch entlasten sie den manuellen Prüfer bei der Analyse und unterstützen ihn in seiner Arbeit.

Für sich allein genommen erreicht keine der drei Arten der Codeprüfung einen hundertprozentigen Effizienzgrad. Hinzu kommt, dass ein nicht zu vernachlässigender Anteil an Softwarefehlern bereits vor Beginn der eigentlichen Entwicklungsprozesses eingeführt wird, beispielsweise bei der Definition von Requirements, was eine Erkennung durch automatisierte Tools erschwert. Darüber hinaus müssen Mittel und Wege gefunden werden, auch wichtige Dokumente und Pläne auf ihre Qualität hin zu analysieren und Anforderungen immer wieder formal auf Änderungen hin zu überprüfen.

Deshalb bleibt festzuhalten: Nur durch eine sinnvolle Kombination aus den Fähigkeiten eines menschlichen Entwicklers sowie der effizienten, automatisierten Unterstützung durch Analyse-Tools kann ein Höchstmaß an Sicherheit für Embedded-Software sichergestellt werden. Durch die Synergie aller drei Methoden lässt sich im Idealfall – wie Capers Jones festhält – eine Fehlerbehebungsrate von über 85 Prozent erreichen.

embedded world 2019:

Perforce, Halle 4, Stand 137
QA Systems, Halle 4, Stand 138

passend zum Thema


  1. Mensch und Maschine müssen sich ergänzen
  2. Automatisierte Softwarelösungen

Lesen Sie mehr zum Thema


Jetzt kostenfreie Newsletter bestellen!