A számítástechnikai , a verem túlcsordulás vagy túlcsordulás verem (angol, verem túlcsordulás ) egy bug okozta folyamatot , amely írás közben egy köteg, írva a külső tér kiosztott, hogy a kémény, így felülírva szükséges információkat a folyamatot.
A verem túlcsordulás kifejezés minden halomra alkalmazható . Ha azonban verem túlcsordulásról beszélünk, akkor általában a végrehajtási veremre utalunk . Ezután pontosabb lenne azt mondani, hogy a végrehajtási verem túlcsordulás , de az informatikusok megszokták, hogy egyszerűen azt mondják, hogy a verem túlcsordul, ha a kontextus azt jelzi, hogy a verem, amelyről beszélünk, a végrehajtási verem.
A cikk további része a végrehajtási verem túlcsordulását tárgyalja.
Az összes programozási nyelvben a végrehajtási verem korlátozott memóriát tartalmaz , amelyet általában a program kezdetekor határoznak meg. A végrehajtási verem nagysága sok tényezőtől függ, beleértve a programozási nyelvet, a processzor architektúráját , a többszálas feldolgozási felhasználást és a rendelkezésre álló RAM mennyiségét . Ha túl sok információt tárolnak a végrehajtási veremben, a verem túlcsordul és felülírja a veremen kívüli programterületeket. Ezután azt mondják, hogy verem túlcsordulás vagy végrehajtási verem túlcsordulás van. Ez általában a program megszakítását eredményezi .
A végrehajtási verem túlcsordulását általában a következő két programozási hiba egyik okozza :
A verem túlcsordulásának leggyakoribb oka a túl mély vagy végtelen rekurzió .
Ne feledje, hogy a mély vagy akár végtelen rekurzió nem mindig okoz halom túlcsordulást. Bizonyos nyelvek, például a Scheme , egyfajta végtelen rekurziót tesznek lehetővé, a terminális rekurziót (angolul farok rekurzió ) verem túlcsordulás nélkül. Ehhez ezek a nyelvek a rekurziót iterációvá változtatják , ezzel kiküszöbölve a végrehajtási verem használatát.
Példák a végtelen rekurzióraVégtelen rekurzió egyetlen funkcióval ( C nyelven )
void a() { a(); } int main() { a(); return 0; }Az előző példában a program itt kezdi meg a végrehajtását main(), amely meghívja a függvényt a(). Ahogy a függvény a()önmagát hívja, ez egy végtelen ciklust hoz létre.
Végtelen rekurzió két funkcióval (C nyelven)
void f(); void g(); int main() { f(); return 0; } void g() { f(); } void f() { g(); }A program itt kezdi meg a végrehajtását main(), amely meghívja a függvényt f(). Ezután a függvények f()és g()hívják egymást, amíg a verem túlcsordul.
A verem túlcsordulásának másik fő oka az, hogy megpróbál több helyet lefoglalni a veremben, mint amennyit a verem elfér. Ez általában annak a következménye, hogy túl sok memóriát igénylő helyi változókat deklarálunk . Ezért a néhány kilobájtnál nagyobb tömböket mindig dinamikusan, nem pedig lokális változóként kell kiosztani .
A deklarált tömb több memóriát fogyaszt, mint amennyi a veremben rendelkezésre áll.
A végrehajtási verem túlcsordulásokat minden olyan dolog kiegészíti, amely csökkenti a verem méretét. Például egy többszálas feldolgozás nélküli program jól működhet, de amint engedélyezi a többszálas feldolgozást , ugyanaz a program halmozott állapotba kerülhet. Ennek oka, hogy a legtöbb szálas program szálanként kevesebb veremterülettel rendelkezik, mint ugyanaz a vezeték nélküli program egyetlen kötegével .