Vad är ett stacköverflöde?
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. Den här typen av fel inträffar på samma sätt som buffertöversvämningar, höga överflöden och stackbuffertöversvämningar. Skillnaden mellan dessa typer av fel beror på vilken datorstruktur som används, och den gemensamma funktionen är att ett försök inträffar att skriva mer data än det finns tillgängligt utrymme för att hålla den.
Symtomen på ett överflöde av stacken kan variera beroende på vilket datorspråk som används och vilken felrapporteringsmaskin som finns tillgänglig. I C ++ manifesteras ofta ett stacköverskridande som ett segmenteringsfel, och det finns ofta ingen ytterligare information för att avgöra var eller hur översvämningen hände. Ett överflöde i Java resulterar ofta i en virtuell maskinkrasch som ger ut en ganska detaljerad felfil. Oavsett vilket språk ett översvämning inträffar kan översvämningen nästan alltid korrigeras genom korrekt felsökning och identifiering av den ursprungliga överströmningskällan.
Datorspråk som erbjuder tydlig minneshantering är ofta lättare att skydda mot stackoverflöde. Vanligt accepterad programmeringspraxis dikterar vanligtvis att för varje minnesdel som ett program tilldelar, bör programmet också ta bort sig själv. C ++ tillåter denna mekanism, och noggrann övervakning på detta sätt kan hålla mängden minne ett program använder till ett minimum. Språk som inte erbjuder explicit minneshantering och i stället använder implicit minneshantering är svårare att skydda från stack overflow-fel. Java hanterar sitt eget minne i sin virtuella maskin, så data kan inte raderas uttryckligen när som helst för att göra plats för mer.
Ett vanligt misstag för nybörjeprogrammerare är att anta att ett stacköverskridande inte kan ske på datorspråk som hanterar sin egen minneshantering. Även om detta verkar troligt till en början, är det inte faktiskt fallet. Språk med implicit minneshantering har ofta skräppasslare som frigör onödiga minnesblock, men dessa sopsamlare fungerar inte alltid när en programmerare förväntar sig. Att förlita sig på sopor är relativt farligt och det kan inte alltid skydda ett program mot ett överströmningsfel.
Överflödesfel kan vara katastrofiskt och stoppa ett helt program, eller de kan vara nästan tyst och låta ett program fortsätta vidare. Dessa andra feltyper är ofta de svåraste att hitta eftersom det kan uppstå ett fel som kom från ett överflöd av många kodrader tidigare. Ett stacköverskridande kräver inte ofta sökning genom ett helt program, men ju längre ett program kan köras efter ett överflöde, desto svårare kan felet vara att hitta och fixa.