Laufzeitfehler
Laufzeitfehler (englisch runtime error) sind in der Informationstechnik Fehler, die während der Laufzeit eines Computerprogramms auftreten.
Beschreibung
Laufzeitfehler führen zum Absturz des ausgeführten Programms, zu falschen Ergebnissen oder zu nicht vorhersehbarem Verhalten des Programms. Die Ursachen dafür können sehr unterschiedlich sein; beispielsweise wenn Variablen mit falschen/inkonsistenten Daten überschrieben oder gefüllt werden – die in nachfolgenden Befehlen zu Fehlern führen.
Abgrenzung
Nicht als Laufzeitfehler gelten Programmfehler, die bereits während der Entwicklung des Programmcodes, z. B. von Entwicklungswerkzeugen wie dem Compiler, festgestellt werden. Sind dies schwerwiegende, zum Beispiel grobe Syntaxfehler, so wird in der Regel kein ausführbarer Code erzeugt, das Programm kann deshalb nicht ausgeführt werden.
Abweichende Bedeutungen
In der Literatur treten darüber hinaus sich in Details unterscheidende Beschreibungen für den Begriff „Laufzeitfehler“ auf:
- So gelten z. B. nach[1][2] oder[3] nur Programmfehler als Laufzeitfehler – die nach dieser Sicht eine der möglichen Klassifizierungen für Programmfehler sind.[4] Nach anderen Quellen können Laufzeitfehler auch andere Ursachen haben, z. B. nach[2] oder[5] („or as a result of external effects“).
- Weiterhin werden Laufzeitfehler zum Teil immer mit Abbruch gleichgesetzt,[6] während bei anderen Autoren [7] auch zur Laufzeit auftretende logische Fehler ohne Abbruch als Laufzeitfehler bezeichnet werden.
- Gemäß Quelle[8] tritt ein ‚Laufzeitfehler‘ nur während der Laufzeit i. S. von Produktivbetrieb auf („...und [wurde] nicht während der Programmentwicklung erkannt“).
Gemäß dem Leitfaden Fehlerklassifikation für Software der BITKOM[9] zählt das Auftreten von Laufzeitfehlern zu den Fehlern der Klasse A ("sehr schwere Fehler, die Anwendung ist nicht lauffähig ..."). Eine Möglichkeit, Laufzeitfehler zu verhindern, besteht darin, Fehlerquellen vorausschauend auszuschließen, beispielsweise durch eine Feldprüfung und Typisierung. Einige Programmiersprachen sehen ergänzend die Möglichkeit vor, Laufzeitfehler als Ausnahmesituationen zu behandeln, um sinnvoll auf unvorhergesehene Ereignisse reagieren zu können.
Fehleridentifikation
Laufzeitfehler werden in vielen Systemumgebungen zur eindeutigen Benennung – und als Verweise in einschlägige Benutzerdokumentationen – mit Nummern gekennzeichnet, z. B. Laufzeitfehler 13 (Typen unverträglich ...), Laufzeitfehler 3190 (zu viele Felder definiert). Auch werden solche Nummerierungen häufig bei Anfragen in Internet-Chats als Referenz benutzt.
Beim Auftreten eines Laufzeitfehlers erzeugt das Betriebssystem in der Regel einen Speicherdump, aus dem ein Softwareentwickler meist nähere Informationen zum Fehler und seiner Ursache erkennen kann.
Typische Beispiele
Die meisten der nachfolgend beschriebenen Fehler würden bei angemessenem Testumfang bereits im Softwaretest erkannt werden und nach der Programmbereinigung nicht mehr als Laufzeitfehler auftreten:
- Verwendung von Objektverweisen, die bisher nicht auf ein Objekt verweisen, sondern auf „gar nichts“ (z. B. Nullpointer in C)
- fehlerhafte Speicherplatzreservierung – tritt vor allem bei Programmiersprachen auf, die keine automatische Speicherbereinigung durchführen, wie C.
- fehlende Dateien, aus denen das Programm Daten beziehen soll.
- Versuch, Datensätze über das Dateiende hinaus zu lesen.
- Division durch Null.
- Server ist nicht verfügbar oder antwortet nicht nach der maximal vorgesehenen Wartezeit
- ein Stack Overflow, dieser tritt typischerweise ein, wenn eine rekursive Funktion zu oft verschachtelt aufgerufen wird; meist liegt eine endlose Rekursion vor, zu der es aufgrund eines Logikfehlers kommt.
- Fehler in der technischen Programmlogik wie Endlosschleifen wegen nie eintretender Endbedingung, fehlerhafte Datenformate, z. B. weil nicht initialisiert, Index-Überlauf oder -Unterschreitung, fehlende, aber benötigte Parameter usw.
- Je nach Definition (beispielsweise bei [7]) sind ‚Laufzeitfehler‘ alle Fehler, die während der Programmlaufzeit auftreten, auch wenn sie nicht zum Programmabbruch führen. Sie können aus jeglicher Art fehlerhafter Implementierung von Programmfunktionalität resultieren – wie fehlerhafte Formeln oder Programmlogik; Verarbeitung fehlerhafter ungeprüfter Eingabedaten; Plus statt Minus; größer statt größer/gleich; falsche (aber existierende) Feldnamen angesprochen; Punkt-vor-Strich-Regel nicht beachtet.
Auch Änderungen an der Systemumgebung, z. B. der Hardware, können, wenn sie in der Software nicht berücksichtigt sind, Laufzeitfehler verursachen, zum Beispiel:
- Versuch eines Datenbankzugriffs, der Datenbankserver ist jedoch ausgefallen
- Versuch, Daten auf einem Wechseldatenträger zu speichern, scheitert daran, dass jemand das Medium aus dem Laufwerk genommen hat oder dass der Datenträger schreibgeschützt ist.
- bei verteilten Anwendungen, bei denen mehrere Rechner gleichzeitig Teile desselben Programms ausführen, kann einer der Rechner ausgefallen sein. Dadurch fehlen dem restlichen Programm Berechnungsergebnisse.
Bedeutung und Folgen
Entsprechend der Vielfalt von Ursachen für Laufzeitfehler kann auch die Bandbreite hinsichtlich der Bedeutung und der Folgen von Laufzeitfehlern sehr groß sein. Bestimmend dafür sind zum Beispiel folgende Aspekte:
- In welcher Systemumgebung tritt der Fehler auf?
Ein Laufzeitfehler beim Softwaretest gilt z. B. im Debugmodus als Normalfall oder er kann absichtlich herbeigeführt werden, zum Beispiel um eine Ausnahmebehandlung zu testen. Im Produktivbetrieb ist er dagegen in der Regel immer ein unerwünschtes, ggf. kritisches Ereignis, das zu erheblichen Störungen führen kann; siehe auch Programmfehlerfolgen. Auch unterscheiden sich Laufzeitfehler im Hinblick auf ihre Folgen danach, ob sie in einem privaten Computerumfeld (z. B. in einem Computerspiel) oder in einem hochsensiblen Unternehmensumfeld auftreten.
- Erkennung/Beseitigung des Laufzeitfehlers / Behebungsdauer
Manche Laufzeitfehler können, abhängig von ihrer Art sehr schnell erkannt und auch behoben werden. Beispiel: Wenn eine Ausgabedatei in den Ausführungsspezifikationen (JCL etc.) nicht definiert war. In anderen Fällen muss zur Fehleranalyse ggf. ein Softwareentwickler eingeschaltet werden. Muss zur Fehlerbehebung eine neue Version der Software bereitgestellt werden, so bedarf dies je nach Situation umfangreicher administrativer Maßnahmen. In zeitkritischen Anwendungen kommt zur Vermeidung von Problemen/Schäden in den durch die Anwendung unterstützten Prozessen der schnellen Analyse und Behebung eine hohe Bedeutung zu.
- Bereits erzeugte (Teil-)Ergebnisse
Wenn zum Zeitpunkt des Laufzeitfehlers bereits Ergebnisse erzeugt waren, muss die Verarbeitung nach der Fehlerbehebung exakt an einer bestimmten Stelle des Programms fortgesetzt oder Ergebnisse müssen in ihrer Wirkung (z. B. bei Veränderungen in Datenbeständen) zurückgesetzt werden (können); siehe auch Rollback.
Einzelnachweise
- Duden Informatik, ISBN 3-411-05232-5.
- Softwareentwickler-Wiki
- Uni Hagen (PDF; 1,2 MB) Masterarbeit Bertschler
- Uni Oldenburg
- BCS Glossary of Computing and ICT
- dickbaldwin alice
- Cay Horstmann JAVA for everyone
- IT-Wissen
- Fehlerklassifikation für Software – Leitfaden. (PDF; 568 KB) BITKOM, 2008, abgerufen am 13. Oktober 2018 (Leitfaden zur Fehlerklassifizierung).