SOFTWAREFEHLER
Der erste Bug Erster Bug: eine Motte Der Begriff Bug (deutsch: Motte) stammt aus dem Jahre 1945, als Ingenieure in einem Schaltrelais eines Computers (Harvard Mark II-System) eine Motte entdeckten. Nach Entfernung des Insekts wurde in das Computer-Logbuch notiert: Erster Fall einer gefundenen Motte.
Absturz der Ariane 5 Ursache: Ein Softwarefehler wurde durch eine Konvertierung einer 64-bit Fließkommazahl in einen 16-bit integer Wert verursacht. Schaden: 1,7 Milliarden DM
8 Tote durch überhöhte Strahlendosis
Arten von Softwarefehlern Syntaxfehler Laufzeitfehler Logische Fehler Designfehler
Syntaxfehler Sind Verstöße gegen die grammatischen Regeln der benutzten Programmiersprache. Ein Syntaxfehler verhindert die Kompilierung des fehlerhaften Programms. Bei Programmiersprachen, die sequentiell interpretiert werden, bricht das Programm an der syntaktisch fehlerhaften Stelle undefiniert ab. Beispiel in Delphi: vor i=1 to 1OO do a=a+1,
Laufzeitfehler alle Arten von Fehlern, die auftreten, während das Programm abgearbeitet wird. Beispiele: Variablen werden Werte zugewiesen, die den Definitionsbereich überschreiten. Treten häufig bei Eingaben, die nicht überprüft werden auf (Unverträglichkeit von Datentypen: String statt Zahl). Wenn Programme unter Betriebssystemen eingesetzt werden, für die sie nicht vorgesehen sind.
Logische Fehler Treten bei einem falschen Ansatz oder falschem Algorithmus auf. Beispiel: Die Inhalte der Variablen a und b sollen getauscht werden: a:=b; b:=a; Was ist daran falsch? Die Summe der ersten 100 Zahlen ist zu bilden: for i:=1 to 100 do; summe:=summe + i;
Designfehler sind Fehler im Grundkonzept, entweder bei der Definition der Anforderungen an die Software, oder bei der Entwicklung des Softwaredesigns, auf dessen Grundlage das Programm entwickelt wird. Beispiel: Ein Programm wird ständig weiterentwickelt. Irgendwann stellt man fest, dass auf Grund einer fehlerhafter Konzeption, Änderungen am Programm sehr aufwändig sind.
Wie können Fehler aufgedeckt werden? Testen, testen, testen Grenzwerte eingeben Dritten testen lassen Schrittweises Durchlaufen
Vermeidung logischer Fehler Vor dem Programmieren Trockentest Struktur des Programms festlegen (Struktogramm etc.) Endlosschleifen vermeiden
Vermeidung von Designfehlern Anforderungen an die Software genau analysieren Mögliche Weiterentwicklungen erahnen
Vermeidung von Laufzeitfehlern Eingabewerte immer überpüfen Lieber größere Definitionsbereiche als zu kleine Abfangen von Fehlern: Überall wo Daten einoder ausgegeben werden muss mit Problemen gerechnet werden.
Fehlerhandling in Delphi 1 Try Anweisung1 Finally Anweisung2 End; Egal was mit Anweisung1 passiert, Anweisung2 wird immer ausgeführt. Wird benutzt, wenn Aufräumarbeiten (z.b. Schließen von Dateien) zwingend erforderlich sind.
Fehlerhandling in Delphi 2 Try Anweisung1 Except Anweisung2 End; Anweisung2 wird nur aufgerufen wenn in Anweisung1 ein Fehler aufgetreten ist.
Beispiel 1 var number, zero : Integer; begin // Division durch Null exception number := -1; Try zero := 0; number := 1 div zero; ShowMessage('number / zero = '+IntToStr(number)); finally if number = -1 then begin ShowMessage('Es wurde kein Wert eingegeben'); number := 0; end; end; end;
Beispiel 2 var number, zero : Integer; begin // Division durch Null Try zero := 0; number := 1 div zero; ShowMessage('number / zero ='+IntToStr(number)); except ShowMessage('Unbekannter Fehler aufgetreten'); end; end;
Fehlervermeidung durch Wiederverwendung geprüften Codes Durch gute Strukturierung und Modularisierung können Objekte/Prozeduren/Funktionen /units wiederverwendet werden Vorsicht: Verwendung fremder Komponenten kann Fehlergefahren erhöhen! Abhängigkeiten werden erzeugt!