Najczęstszą przyczyną przepełniania stosu jest nieskończona rekurencja. Gdy przeprowadzona jest optymalizacja rekurencji ogonowej nieskończona rekurencja może zaistnieć bez przepełnienia stosu, bo kolejne wywołania tej funkcji nie zajmują dodatkowego miejsca na stosie – co w rezultacie prowadzi do pętli nieskończonej. Gdy język nie wspiera rekurencji ogonowej można stosować trampolinę, aby nie zużywać stosu i nie doprowadzić do przepełnienia stosu. Przykłady w C++ Nieskończona rekurencja void foo() { bar(); } void bar() { foo(); }
foo() wywołuje bar(), który z kolei wywołuje foo() i tak dalej. W końcu dochodzi do przepełnienia stosu.
Alokacja dużej tablicy na stosie
int main() { int n[10000000]; // tablica jest zbyt duża int j =0; // j nie mieści się już na stosie, błąd }
Przykład w Visual Basic
Sub bar()
foo
End Sub
Sub foo()
bar
End Sub
Tutaj najpierw wywoływana jest funkcja foo(), po której bezpośrednio jest wykonywana funkcja bar(). Dochodzi do wzajemnej aktywacji wcześniej wspomnianych funkcji kończącej się brakiem miejsca w stosie dla którejś funkcji.
Zobacz też przepełnienie bufora
Przypisy
Kategoria:Błędy programów komputerowych