Vad är en Stack Overflow?

Stack overflow är ett programmeringsfel där ett försök att skriva data till ett visst minnesblock misslyckas eftersom det inte finns något utrymme kvar i blocket. Denna typ av fel inträffar på samma sätt som buffertspill, heap-spill och stackbuffertspill. Skillnaden mellan dessa typer av fel beror på vilken datordatastruktur som används, och det gemensamma är att ett försök görs att skriva mer data än vad det finns tillgängligt utrymme för att hålla den.

Symtom på ett stackspill kan variera beroende på vilket datorspråk som används och tillgängligt felrapporteringsmaskineri. I C++ manifesterar ett stackspill sig ofta som ett segmenteringsfel, och ofta ges det ingen ytterligare information för att avgöra var eller hur överflödet inträffade. Ett spill i Java resulterar ofta i en virtuell maskinkrasch som ger ut en någorlunda detaljerad felfil. Oavsett på vilket språk ett överflöde inträffar, kan överflödet nästan alltid korrigeras genom korrekt felsökning och identifiering av den ursprungliga bräddkällan.

Datorspråk som erbjuder explicit minneshantering är ofta lättare att skydda mot stackspill. Allmänt accepterad programmeringspraxis kräver vanligtvis att för varje minnessegment som ett program allokerar, bör programmet också radera sig självt. C++ tillåter denna mekanism, och noggrann övervakning på detta sätt kan hålla mängden minne som ett program använder till ett minimum. Språk som inte erbjuder explicit minneshantering, och istället använder implicit minneshantering, är svårare att skydda från stackoverflow-fel. Java hanterar sitt eget minne inuti sin virtuella maskin, så data kan inte explicit raderas för att göra plats för mer.

Ett vanligt misstag för nybörjare som programmerare är att anta att ett stackspill inte kan inträffa i datorspråk som hanterar sin egen minneshantering. Även om detta verkar rimligt till en början, är det faktiskt inte fallet. Språk med implicit minneshantering har ofta sopsamlare som frigör onödiga minnesblock, men dessa sopsamlare fungerar inte alltid vid den tidpunkt en programmerare förväntar sig. Att förlita sig på sophämtare är relativt farligt, och det kan inte alltid skydda ett program från ett spillfel.

Overflow-fel kan vara katastrofala och stoppa ett helt program, eller så kan de vara nästan tysta och tillåta ett program att fortsätta framåt. Dessa andra typer av fel är ofta svårast att hitta eftersom ett fel kan uppstå som kom från en översvämning av många rader kod tidigare. Ett stackspill kräver inte ofta att man söker igenom ett helt program, men ju längre ett program kan köras efter ett spill, desto svårare kan felet vara att hitta och åtgärda.