Wikipedia · einfach zusammengefasst · Stand
Endlosschleife (Programmierung)
Eine Endlosschleife ist in der Programmierung eine Schleife, die nach jeder Abarbeitung erneut abgearbeitet wird, falls die Ausführung nicht durch äußere …
Inhalt5 Abschnitte
Begriff und Bedeutung
Eine Endlosschleife ist eine Schleife, die nach jedem Durchlauf erneut ausgeführt wird, solange kein äußerer Einfluss die Ausführung abbricht. Als äußerer Einfluss gilt ein Eingriff, der im regulären Programmablauf nicht vorgesehen ist, etwa das Abschalten des Computers.
Endlosschleifen können unbeabsichtigt durch Programmierfehler entstehen, aber auch absichtlich eingesetzt werden. Ein wichtiges beabsichtigtes Beispiel ist die Ereignisschleife (englisch event loop oder message dispatcher), die auf Ereignisse wie Benutzereingaben wartet. Solche Schleifen können auch ohne aktives Warten arbeiten.
Ursachen und Erscheinungsformen
Bei Endlosschleifen sind drei Fälle zu unterscheiden:
- Die Schleife besitzt kein Abbruchkriterium. Das kann beabsichtigt sein und lässt sich beim Debuggen meist leicht erkennen.
- Das vorhandene Abbruchkriterium kann niemals erfüllt werden.
- Das Abbruchkriterium wird nur bei bestimmten Eingangsparametern nie erfüllt. Dieser meist unerwünschte Fall kann schwer zu finden sein, weil er möglicherweise nur selten auftritt. Eine Ursache ist, dass der Programmzustand zu Beginn der Schleife die Schleifeninvariante nicht erfüllt. Eine Schleifeninvariante ist eine Bedingung, die bei jedem Schleifendurchlauf erhalten bleiben soll.
Die Folgen hängen vom Schleifenrumpf ab. Werden dort wiederholt Ressourcen wie Hauptspeicher belegt, aber nicht freigegeben, entsteht im Allgemeinen ein Speicherleck. Eine Endlosschleife kann sich gegenüber dem Benutzer auch als Inaktivität oder „Einfrieren“ des Programms zeigen.
Absichtlicher Einsatz
Geräte, für die kein geordnetes Herunterfahren vorgesehen ist, besitzen häufig mindestens eine Endlosschleife, die im Grundzustand auf Benutzereingaben wartet.
Auch auf Computersystemen mit Möglichkeiten zum geordneten Programmabbruch werden Endlosschleifen gezielt verwendet. In Multitasking-Systemen sind Ereignisschleifen üblich, die fortlaufend auf Benutzereingaben warten. Bei einem Singletasking-System kann höchstens eine solche Schleife gleichzeitig arbeiten. Beendet werden diese beabsichtigten Endlosschleifen durch die vom System bereitgestellten äußeren Abbruchmöglichkeiten.
Typische Programmierfehler
Typische Beispiele sind:
- Eine Variable wird in der Schleife nicht verändert: Beginnt
numberbei0und lautet die Bedingungnumber < 10, bleibt sie ohne ein Inkrement wienumber += 1dauerhaft wahr. - Bei Gleitkommazahlen kann eine scheinbar erreichbare Abbruchbedingung verfehlt werden: Wird
numberausgehend von0.1immer um0.1erhöht und aufnumber != 1.0geprüft, wird1.0nie exakt erreicht, weil0.1in binärer Form periodisch ist. - Eine Rekursion ohne erreichbare Abbruchbedingung ruft sich immer wieder selbst auf. Sie endet schließlich mit einem Stapelüberlauf und dem Absturz des Programms.
- Eine Bedingung wie
while (true)ist immer wahr. Enthält die Schleife jedoch eine erreichbarebreak-Anweisung, ist sie keine Endlosschleife mehr. - Ein unbedingter Sprungbefehl kann immer wieder zu derselben Stelle zurückspringen. Ohne einen bedingten Sprung zum Programmende wird dieser Ablauf nie verlassen.
Vorbeugung und Begrenzung
Zur Vorbeugung kann die Schleifenbedingung formal verifiziert werden, beispielsweise mit dem wp-Kalkül. Dabei wird mathematisch geprüft, ob die gewünschten Bedingungen des Programms erfüllt werden. Dieses Verfahren ist schon bei kleinen Programmen sehr aufwändig; allgemein ist die Frage, ob ein Programm anhält, wegen des Halteproblems sogar unlösbar.
Ein Watchdog verhindert Endlosschleifen nicht, kann ihre Auswirkungen aber zeitlich begrenzen. Er überwacht, ob ein Programm regelmäßig signalisiert, dass es ordnungsgemäß läuft. Bleibt dieses Signal aus, kann der Watchdog reagieren, etwa den Benutzer benachrichtigen oder das Programm beenden.