Zásobníkový rám

Stack frame (z angl .  stack frame ) - mechanismus pro předávání argumentů a přidělování dočasné paměti (v procedurách programovacích jazyků vyšší úrovně) pomocí systémového stacku .

Technologie

Typicky se systémový zásobník používá k ukládání návratových adres při volání podprogramů a také k ukládání/obnovení hodnot registru procesoru.

Předávání argumentů

Když je volána procedura, argumenty jsou vloženy do zásobníku před voláním podprogramu. Procedura tedy obdrží zásobník, na jehož vrcholu leží návratová adresa, a pod ní - argumenty, se kterými byla volána.

Při návratu z procedury (nebo po ní, viz níže) musí být argumenty odstraněny ze zásobníku.

Dočasné přidělení paměti

Pokud se ukazatel zásobníku posune „výše“ (ve směru zvětšování zásobníku), pak bude část paměti v zásobníku nevyužita (včetně volání třetí procedury) a může být procedurou použita dle svého uvážení, nahoru do okamžiku, kdy se vrátí k proceduře, která jej vyvolala. Jazyky na vysoké úrovni tedy organizují proměnné, které existují pouze v rámci procedury (jazyk C je nazývá „automatické“).

Před návratem musí procedura vrátit ukazatel zásobníku do původní polohy (tedy na zpáteční adresu).

Konvence pro různé programovací jazyky

Různé kompilátory jazyků na vysoké úrovni přistupují k organizaci rámce zásobníku různými způsoby, v závislosti na vlastnostech hardwarové platformy a standardech konkrétního jazyka. Hlavní rozdíly se týkají pořadí, ve kterém jsou argumenty předávány do zásobníku a kdy jsou při návratu ze zásobníku odstraněny.

Nevýhody stohovaného rámu

Rámec zásobníku je vhodná technologie pro přidělování dočasné paměti pro předávání libovolného počtu argumentů nebo pro interní použití. Má však řadu nevýhod.

Výkon

Procházení dat pamětí zbytečně zpomaluje provádění programu (ve srovnání s programy v assembleru , ve kterých je většina argumentů a dočasných dat umístěna v registrech procesoru).

Aby se omezil přístup k lokálním proměnným, je program při kompilaci optimalizován tak, aby místo proměnných v paměti používal registry nebo ukládal jejich mezihodnoty.

Některé jazyky používají konvence volání, které podporují předávání celočíselných argumentů prostřednictvím registrů.

Zabezpečení

Rámec zásobníku prokládá data aplikace s kritickými daty – ukazateli, hodnotami registrů a návratovými adresami. To v kombinaci s architekturou některých procesorů (jmenovitě se směrem růstu zásobníku) velmi snadno dosahuje škodlivého přetečení kritických dat v důsledku přetečení vyrovnávací paměti (program samozřejmě musí nejprve obsahovat chybu, která přetečení umožní nastat).

Takový „neúspěšný“, z pohledu přetečení bufferu, směr růstu strojového stacku má hardwarové platformy: X86 .

Útok přetečením zásobníku zásobníku je obvykle implementován následovně:

Viz také