Oändlig slinga
Den här artikeln behöver källhänvisningar för att kunna verifieras. (2018-11) Åtgärda genom att lägga till pålitliga källor (gärna som fotnoter). Uppgifter utan källhänvisning kan ifrågasättas och tas bort utan att det behöver diskuteras på diskussionssidan. |
Oändlig slinga är inom programmeringen ett programfel där en slinga aldrig avbryts, vilket gör att programmet (eller åtminstone den tråd som kör) slutar svara.
Förklaring
[redigera | redigera wikitext]Antag att vi har en mängd textsträngar som indexeras med heltalen 0, 1, ..., n. För att erhålla strängen med index index
används funktionen GetText
. Det är inte i förhand känt hur många strängar som finns (vi vet ej vad n är), utan funktionen TextExists
används för att avgöra om det finns någon text med indexet index
eller ej. För att skriva ut alla textsträngar används följande kod:
index := 0;
while TextExists(index) do
begin
writeln(GetText(index));
index := index + 1;
end;
Första raden sätter index
till noll. Sedan skrivs texten GetText(index)
ut, index
ökas med ett, texten GetText(index)
skrivs ut igen med detta nya värde på index
och så vidare ända tills TextExists(index)
ger värdet "falskt", och slingan avbryts. En tankspridd programmerare kan lätt glömma raden index := index + 1
:
index := 0;
while TextExists(index) do
begin
writeln(GetText(index));
end;
Det som då händer är att index
aldrig ökas från noll till ett, och att påståendet TextExists(index)
då aldrig blir falskt. Resultatet blir att kommandot writeln(GetText(0))
utförs om och om i all oändlighet. Vi har fått en oändlig slinga, där programmet skriver ut texten GetText(0)
om och om igen, utan att svara på några andra kommandon, tills någon dödar processen manuellt (till exempel genom Aktivitetshanteraren i Windows). Osparade data i programmet går då förlorade.
Tolkning av begreppet "oändlig"
[redigera | redigera wikitext]Koden nedan ser ut som ett typexempel på en oändlig slinga:
i := 0;
while 1+1=2 do
begin
i := i + 1;
end;
Eftersom påståendet 1+1=2
alltid är sant, kommer slingan aldrig att avbrytas på normalt sett. Men varje gång slingan körs ökar värdet på heltalsvariabeln i
, och till slut kommer värdet att nå det högsta möjliga tal som datorn kan lagra i variabeln. Vanligtvis kommer då slingan att avbrytas på grund av detta fel (engelska: integer overflow).
Andra typer av oändliga slingor
[redigera | redigera wikitext]Den typ av oändlig slinga som beskrevs ovan handlar om en egentlig slinga som aldrig avbryts. En liknande typ av bugg, som också kan kallas oändlig "slinga", inträffar då en serie av rekursiva funktionsanrop aldrig avslutas. Namnet "oändlig slinga" motiveras av att effekten av buggen liknar den som erhålles vid en egentlig oändlig slinga. Betrakta exemplet nedan.
function DoSomething(x: integer);
begin
result := DoSomething(x);
end;
När funktionen DoSomething
anropas kommer samma funktion DoSomething
att anropas på nytt i all "oändlighet". Citationstecknen kommer av att felet stack overflow så småningom inträffar och bör avbryta rekursionen.
Notera emellertid att rekursiva funktionsanrop inte måste ge upphov till oändliga slingor, utan detta sker endast om rekursionen aldrig avbryts. Koden nedan visar hur en rekursiv metod kan användas för att beräkna fakultet:
function Fact(n: integer);
begin
if n = 0 then
result := 1
else
result := n*Fact(n-1);
end;
Oändliga slingor i gamla operativsystem
[redigera | redigera wikitext]I äldre operativsystem, såsom Windows 9x-system, kan en oändlig slinga i ett program få hela systemet (datorn) att sluta svara.