Přetečení zásobníku

Přetečení zásobníku je situace v programování, kdy dojde k pokusu uložit na zásobník volání více dat, než kolik se tam vejde. Velikost tohoto zásobníku je obvykle předem dána při startu programu v závislosti na architektuře systému, překladači, množství volné paměti atp. Když se program pokusí posunout vrchol zásobníku mimo vymezenou paměť, mluvíme o přetečení zásobníku. To má obvykle za následek pád programu.

Důvodem přetečení je nejčastěji jedna z následujících programátorských chyb:

Nekonečná rekurze

Nejčastějším problémem programu, který spadne kvůli přetečení zásobníku, je nekonečná rekurze. V některých programovacích jazycích, které používají koncovou rekurzi, například v jazyce Scheme, je nekonečná rekurze v případě využití koncové rekurze povolena, protože její volání nezabírá místo na zásobníku. Naproti tomu následující příklad v jazyce C skončí pádem programu:

int foo() {
     return foo();
}

Než se totiž řízení vrátí z funkce foo() zpět, znovu dojde k zavolání funkce foo(). Než se z té vrátí řízení, dojde k dalšímu zavolání funkce foo(). Každé zavolání funkce přitom zabere několik bajtů na zásobníku, takže časem bude běh procesu ukončen chybou přístupu do paměti, až na zásobníku dojde místo.

Příliš objemné proměnné na zásobníku

Místo pro lokální proměnné je obvykle vytvářeno právě na zásobníku volání. Pokud se tedy programátor v programu pokusí vytvořit velké pole jako lokální proměnnou, pak je možné, že se už na zásobníku pro toto pole nenajde místo. Například tato ukázka v jazyce C

int foo() {
     double x[1000000];
}

si žádá na zásobníku 8 megabajtů (pokud má proměnná typu double paměťové nároky 8 bajtů). Pokud na zásobníku už nezbývá tolik prostoru, pak skončí program chybou.

Reference

V tomto článku byl použit překlad textu z článku Stack overflow na anglické Wikipedii.