Dr. Rainer Gerlich Diplom-Physiker BSSE System and Software Engineering DGLR Workshop Fachausschuss Q3.4, 2016 „Software Safety“ Titel: Ergebnisse und Empfehlungen aus der Fehleranalyse von Raumfahrtsoftware Autoren: Rainer Gerlich, Ralf Gerlich Inhalt: Der Inhalt des Vortrages basiert auf Ergebnissen, die während fast 10 Jahren in verschiedenen Raumfahrtprojekten gesammelt wurden, in denen C verwendet wurde. Ziel ist, auf Aspekte der Verifikation von Software, der Fehlerprävention und mittels Beispielen auf typische Fehler hinzuweisen. Folgende Punkte sollen mit Beispielen angesprochen werden: Code vs. Verifikation Die Komplexität der Verifikation des Codes – durch statische oder dynamische Analyse (Test) – und zugehöriger Aufwand hängen wesentlich vom Codierstil ab. Je klarer der Code interpretiert werden kann, desto einfacher ist die Verifikation, sowohl für ein Tool als auch für den Prüfenden. Wesentlich für den Verifikationsaufwand ist die Klärung der nicht sicher als fehlerhaft oder korrekt einzustufenden Meldungen eines Tools. Je mehr solcher Meldungen es gibt, desto größer ist der Aufwand. Ist vorab bekannt, wie die Anzahl solcher Meldungen verringert werden kann, so kann der Aufwand der Verifikation erheblich reduziert werden. Wird ein Verifikationstool bereits von Beginn der Codierungsphase an eingesetzt, so können auf der Basis der ausgewerteten Meldungen Korrekturen am Codierungstil oder der Systemarchitektur rechtzeitig vorgenommen und somit die Anzahl der Meldungen zum Projektende (Quality Gate) signifikant reduziert werden. Notwendigkeit der Definition von Verifikationszielen Beim Funktionstest wird eine Funktion hinsichtlich funktionaler und nicht-funktionaler Eigenschaften im Hinblick auf die speziellen Anforderungen an die Funktion und allgemeiner Anforderungen untersucht. Aus Systemsicht kann es aber ausreichen nachzuweisen, dass die Funktion im Systemkontext die Anforderungen voll erfüllt. Bspw. kann eine Funktion im Systemkontext für einen reduzierten Wertebereich der Daten benutzt werden, so dass kritische Werte, die einen Fehler auslösen würden, nicht vorkommen können. Ob geringere Anforderungen an eine Funktion bedingt durch den Systemkontext bei der Verifikation berücksichtigt werden sollen oder nicht, sollte früh im Entwicklungs- und Testplan festgelegt werden. Es muss entschieden werden: • Robustheit und höherer Verifikations- bzw. Testaufwand, aber stabileres System und weniger Wartungsaufwand, • Design-by-Contract und niedriger Verifikations- bzw. Testaufwand, aber ein System, das gerade die momentanen Anforderungen erfüllt bei zu erwartendem höheren Wartungsaufwand. Fehlermanagement In vielen Fällen wurde beobachtet, dass die Fehlererkennung und -behandlung unzureichend ist. Vielfach wird nicht beachtet, dass die Art der Fehlerbehandlung nicht nur lokale, sondern auch eine systemweite Bedeutung hat, sofern überhaupt eine Fehlerbehandlung erfolgt. Es fehlt dann ein vorgegebener ganzheitlicher Ansatz, dass und wie Fehler zu behandeln sind. Das Fehlerbehandlungskonzept muss bereits mit der Systemarchitektur definiert werden. Bspw. ist es nicht sinnvoll, einen Fehler lokal – wie auch immer – zu maskieren, aber den Vorfall nicht anzuzeigen. Verschiedene Fehler beim Fehlermanagement und Strategien zu größerer Robustheit werden beschrieben. Sicher Programmieren © Dr. Rainer Gerlich – BSSE System and Software Engineering 2016 Auf dem Ruhbühl 181, 88090 Immenstaad, Tel. 07545/911258, 0171/8020659, Fax 07545/911240 [email protected] BSSE System and Software Engineering Durch geeignete Maßnahmen kann Software inhärent sicher werden. Schwache, unsichere Algorithmen implizieren ein endliches Risiko für einen Systemausfall oder einen eingeschränkten Betrieb. Sichere Algorithmen schließen jegliches Risiko aus. Bei ausreichender Erfahrung implizieren sie meistens keinen erhöhten Aufwand. Diese Erfahrung kann durch Feedback aus der Analyse von Schwachstellen – bspw. angezeigt durch Verifikationswerkzeuge – gewonnen werden, wie an Beispielen gezeigt wird, die zu einem erhöhten Risiko führen: • potenzielle Inkonsistenzen • Mix signed – unsigned • Macros mit Seiteneffekten • Abweichung von Konventionen • hohe Komplexität, auch durch Standards Zusammenfassung Vor Beginn der Entwicklung sind bereits Maßnahmen zu treffen mit dem Ziel, Regeln festzulegen für • die Verifikation und die Abnahme, • die Fehlerbehandlung, • die Dokumentation von erkannten Schwachstellen und deren zukünftiger Vermeidung, • die Verwendung sicherer Algorithmen. Der Aufwand für die Verifikation kann signifikant verringert werden, wenn während der Entwicklung ständig – in dem notwendigen Maß – überprüft wird, ob die vereinbarten Regeln auch eingehalten werden. Erhöhter Verifikationsaufwand entsteht immer dann, wenn Regeln nicht eingehalten werden, und dann sehr viele Beanstandungen festgestellt werden. Insbesondere erhöht sich der Aufwand signifikant, wenn codiert wird, bevor alle Regeln bekannt sind, die bei der Verifikation angewendet werden sollen. Die Meldungen von Tools sollten konsequent genutzt werden, um die Qualität des Codes zu verbessern. Die überwiegende Anzahl von solchen Meldungen ist berechtigt, und sie sollten ernst genommen werden. Kontakt: Dr. Rainer Gerlich Dr. Ralf Gerlich [email protected] [email protected] Dr. Rainer Gerlich BSSE System and Software Engineering (BSSE) Auf dem Ruhbühl 181, 88090 Immenstaad Tel. 07545/911258 Fax 07545/911249 -2© Dr. Rainer Gerlich BSSE System and Software Engineering 2016
© Copyright 2024 ExpyDoc