Ponadto kompilatory z włączonymi optymalizacjami lubią robić różne nieprzewidywalne rzeczy, np. często obiekty automatyczne znajdują się w rejestrze procesora, nawet bez klauzuli register. Dlatego czasem trzeba uważać ze wstawkami asemblerowymi, jeśli ktoś takowe z jakichś powodów stosuje. Ale to jest osobny temat .
1) Obiekty z przydomkiem register mogą być też typu zmiennoprzecinkowego, prawda :?: Zostaną wtedy umieszczone (jeżeli kompilator się na to “zgodzi” jak wspomniał [alex]) w FPU.
2) Na Wikipedii jest napisane, że przepełnienie sterty to jeden z rodzajów przepełnienia bufora. Wychodzi na to, że sterta to bufor, ale przecież bufor to obszar pamięci, który jest wykorzystywany gdy jedno z urządzeń komputera nie jest w stanie w danej chwili odebrać danych kierowanych do niego. Program to nie urządzenie komputera - o co chodzi :?:
Jeszcze oprócz tego pytania z poprzedniego postu mam trzy kolejne:
2) Na Wikipedii jest napisane, że przepełnienie sterty powoduje nadpisanie struktur kontrolnych programu. Czym są te struktury :?: Bo z tego co znalazłem, to w PHP to są np. instrukcje warunkowe i pętle oraz instrukcja switch. Jeżeli w C++ jest tak samo, to to przepełnienie nadpisuje jakby wnętrze programu, tak :?:
3) Dlaczego przepełnienie stosu powstaje już przy przekroczonej granicy ok. 1MB na zmienne lokalne :?: Przecież wielkie programy mają po kilkanaście GB - OK, trochę miejsca zajmują też zmienne globalne, które na stosie zakładane nie są, ale podkreślam trochę.
4) Odnośnie normalnego obszaru pamięci (w którym alokowane są zmienne globalne i statyczne) to w architekturze x86 granica o ile wiem wynosi 2GB, a w x64 nie ma już ograniczeń, prawda :?:
Wielkość stosu zależy od systemu operacyjnego, kompilatora i jego opcji. A stos przepełnić można i funkcją rekurencyjną beż żadnych zmiennych lokalnych - bez optymalizacji wywołanie funkcji najczęściej oznacza wrzucenie kilku rejestrów na stos - dla “pusha” jest to (AX, CX, DX, BX, SP, BP, SI, DI) - w kodzie 32 bitowym oznacza to 8*4=32 bajty na każde wywołanie funkcji( plus jeszcze adres powrotu).