Hoppa till innehållet

Oändlig slinga

Från Wikipedia
(Omdirigerad från Oändlig loop)

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.

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.