Stack frame (från engelska stack frame ) - en mekanism för att skicka argument och allokera temporärt minne (i procedurerna för programmeringsspråk på hög nivå) med hjälp av systemstacken .
Vanligtvis används systemstacken för att spara returadresser vid anrop av subrutiner, samt för att spara/återställa processorregistervärden.
När en procedur anropas, skjuts argumenten till stacken innan subrutinen anropas. Således får proceduren en stack, högst upp ligger returadressen, och under den - argumenten med vilka den anropades.
När du återvänder från proceduren (eller efter den, se nedan), måste argumenten tas bort från stacken.
Om stackpekaren flyttas "högre" (i riktning mot att öka stacken), kommer en del av minnet i stacken att vara oanvänd (inklusive när den tredje proceduren anropas) och kan användas av proceduren efter eget gottfinnande, upp tills den återgår till proceduren som kallade den. Således organiserar högnivåspråk variabler som bara existerar inom en procedur (C-språket kallar dem "automatiska").
Innan du returnerar måste proceduren returnera stapelpekaren till sin ursprungliga position (det vill säga till returadressen).
Olika kompilatorer av högnivåspråk närmar sig organisationen av stackramen på olika sätt, beroende på egenskaperna hos hårdvaruplattformen och standarderna för ett visst språk. De huvudsakliga skillnaderna hänför sig till den ordning i vilken argument skickas till stacken och när de tas bort från stacken vid retur.
Stackramen är en bekväm teknik för att allokera temporärt minne för att skicka ett godtyckligt antal argument eller för internt bruk. Det har dock ett antal nackdelar.
Att skicka data genom minnet saktar i onödan ner programexekveringen (jämfört med assembly-språkprogram , där de flesta argument och temporära data placeras i processorregister).
För att minska tillgången till lokala variabler optimeras programmet vid kompilering för att använda register istället för variabler i minnet, eller för att lagra deras mellanvärden.
Vissa språk använder anropskonventioner som stöder att skicka heltalsargument genom register.
Stackramen interfolierar applikationsdata med kritiska data – pekare, registervärden och returadresser. Detta, i kombination med arkitekturen hos vissa processorer (nämligen riktningen för stacktillväxt), gör det mycket lätt att uppnå skadlig översvämning av kritisk data på grund av ett buffertspill (naturligtvis måste programmet först innehålla en bugg som tillåter överflödet till inträffa).
En sådan "misslyckad", ur buffertspillsynpunkt, riktning för tillväxt av maskinstacken har hårdvaruplattformar: X86 .
En stackbuffertspillattack implementeras vanligtvis enligt följande: