Programmfehler

Fehlverhalten in Computerprogrammen
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 17. Mai 2004 um 00:16 Uhr durch 82.83.245.2 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Ein Programmfehler, im englischen auch einfach Bug (Wanze, Käfer, Insekt) genannt, ist ein Ausdruck aus dem EDV-Bereich. Ein Programmfehler tritt in Computerprogrammen auf, wenn der Programmierer einen bestimmten Zustand in der Programmlogik nicht berücksichtigt hat, oder wenn die Laufzeitumgebung selber fehlerhaft arbeitet. Auch Unvollständigkeit, Fehler, Ungenauigkeiten, Mehrdeutigkeiten o.ä. in der Spezifikation des Programms können zu Bugs führen, bzw. als solche interpretiert werden. Es gibt eine Regel, nach der ein Computerprogramm ab einer bestimmten Größe immer auch Programmfehler beinhaltet. Auch nichtinitialisierte Variablen führen im Programmablauf zu undefinierten, meist nicht reproduzierbaren Zuständen.

Die Bezeichnung Bug entstand, als 1945 eine Motte in einem der ersten Computer einen Kurzschluss verursacht hatte. US Navy Captain Grace Murray Hopper, eine Pionierin der Computerwissenschaft, entdeckte den Bug und klebte die Motte in ihr Logbuch ein, das heute am Smithsonian Institute aufbewahrt wird (siehe auch moderne Legende).

Vermeidung und Behebung von Programmfehlern

Fehlern in Computerprogrammen wird auf vielfältige Art und Weise begegnet.

Zum Einen versucht man, Programmfehler durch bestimmte Methoden während der verschiedenen Phasen der Software-Entwicklung von vornherein zu vermeiden. Unter anderem gehören dazu das Vier-Augen-Prinzip mittels regelmäßiger Code-Reviews, Paarprogrammierung und gemeinsamem Code-Besitz sowie die gute Planung, Analyse und Entwurf.

Zum Anderen will man Programmfehler möglichst schnell, zuverlässig und einfach finden. Dazu zählt u.a. das Debugging ("Entwanzung", Entfehlerung) mit Hilfe speziell dafür entwickelter Werkzeuge, genannt Debugger und die Einplanung spezieller Test-Phasen.

Manche Softwareanbieter führen diese Test-Phasen teilweise öffentlich durch und geben Betaversionen heraus, um die unvorhersehbar vielfältigen Nutzungsbedingungen verschiedener Anwender durch diese selbst testen und kommentieren zu lassen. Dies nennt man scherzhaft auch "Bananensoftware", weil sie erst beim Kunden reift.

Tests sind Prozeduren und Programme, die einen Programmfehler reproduzierbar auslösen sollen, um sie einzugrenzen und zu vermeiden, sie dienen sowohl zur Vermeidung als auch zum Auffinden von Programmfehlern.

Insbesondere in Bereichen, in denen der Einsatz von Software mit hohen finanziellen, wirtschaftlichen oder menschlichen Risiken verbunden ist, wie z.B. bei militärisch oder medizinisch genutzer Software oder in der Luft- und Raumfahrt, verwendet man zudem eine Verifizierung genannte Methode, bei der die Korrektheit einer Software formal nachgewiesen wird. Dieser Methode sind allerdings enge Grenzen gesetzt und sie ist daher bei komplexen Programmen praktisch oder sogar theoretisch unmöglich anzuwenden.

Auch die Entwicklung immer komplexerer Programmierparadigmen und Programmierstile wie die Objektorientierte Programmierung, Design By Contract und die Aspektorientierte Programmierung dienen unter anderem der Fehlervermeidung und Vereinfachung der Fehlersuche.


Arten von Programmfehlern

Es gibt verschiedene Möglichkeiten, Programmfehler zu klassifizieren.

Eine Klassifizierung nach Auffindbarkeit kategorisiert Programmfehler in Bohrbugs und Heisenbugs.

Einen in einer früheren Programmversion bereits behobenen Bug, der in einer späteren Programmversion wieder auftaucht, nennt man dort Regressionsbug.

Weitere Klassifizierungskriterien sind z.B. die Wahrscheinlichkeit des Auftretens des Bugs, der den Bug enthaltende Programmteil, die Auswirkung eines Bugs auf die praktische Einsetzbarkeit des Programms oder das Test-Verfahren, das den Bug identifiziert.


Folgen von Programmfehlern

Die Folgen eines Programmfehlers können außerordentlich sein:

  • 1962 führte ein fehlender Bindestrich in einem Fortran-Programm zum Verlust der Venus-Sonde Mariner 1, welche über 80 Millionen US-Dollar gekostet hatte.
  • Zwischen 1985 und 1987 gab es mehrere Unfälle mit dem medizinischen Bestrahlungsgerät Therac-25. Infolge einer Überdosis, die durch fehlerhafte Programmierung und fehlende Sicherungsmaßnahmen verursacht wurde, mussten Organe entfernt werden, ein Patient verstarb drei Wochen nach der Bestrahlung.
  • 1996 wurde der Prototyp der Ariane 5-Rakete der Europäischen Raumfahrtbehörde eine Minute nach dem Start zerstört, weil Programmcode, der von der Ariane 4 übernommen wurde und nur für einen (von der Ariane 4 nicht überschreitbaren) Bereich funktionierte, die Steuersysteme zum Erliegen brachte, nachdem ebendieser Bereich von der Ariane 5 erreicht wurde.
  • 1999 verpasste die NASA-Sonde Climate Orbiter den Landeanflug auf den Mars, weil die Programmierer das falsche Maßsystem verwendeten -- Yard statt Meter. Die NASA verlor dadurch die mehrere hundert Millionen Dollar teure Sonde.

Siehe auch: Ada (Programmiersprache)