Kaj je pretok sklada?

Prelivanje sklada je programska napaka, pri kateri poskus zapisovanja podatkov v določen blok pomnilnika ne uspe, ker v bloku ni več prostora. Ta vrsta napak se zgodi na enak način kot prelivanja medpomnilnika, kopice in prelivanja medpomnilnika sklada. Razlika med temi vrstami napak je odvisna od uporabljene strukture računalniških podatkov, skupna značilnost pa je, da se zgodi poskus zapisovanja več podatkov, kot je na voljo prostora za shranjevanje.

Simptomi prekoračitve sklada se lahko razlikujejo glede na uporabljeni računalniški jezik in razpoložljivi stroj za poročanje o napakah. V C++ se prelivanje sklada pogosto kaže kot napaka v segmentaciji in pogosto ni podanih dodatnih informacij, ki bi določile, kje ali kako se je prelivanje zgodilo. Prelivanje v Javi pogosto povzroči zrušitev navideznega stroja, ki izda dokaj podrobno datoteko z napakami. Ne glede na jezik, v katerem se zgodi prelivanje, je prelivanje skoraj vedno mogoče popraviti s pravilnim odpravljanjem napak in identifikacijo izvirnega vira prelivanja.

Računalniške jezike, ki ponujajo eksplicitno upravljanje pomnilnika, je pogosto lažje zaščititi pred preobremenitvijo sklada. Splošno sprejeta programska praksa običajno narekuje, da se mora program za vsak segment pomnilnika, ki ga dodeli program, tudi sam izbrisati. C++ omogoča ta mehanizem in tako skrbno spremljanje lahko zmanjša količino pomnilnika, ki ga program uporablja na minimum. Jezike, ki ne ponujajo eksplicitnega upravljanja pomnilnika in namesto tega uporabljajo implicitno upravljanje pomnilnika, je težje zaščititi pred napakami prekoračitve sklada. Java upravlja s svojim pomnilnikom znotraj svojega virtualnega stroja, zato podatkov ni mogoče izrecno izbrisati po želji, da bi naredili prostor za več.

Pogosta napaka programerjev začetnikov je domneva, da se prelivanje sklada ne more zgoditi v računalniških jezikih, ki upravljajo lastno upravljanje pomnilnika. Čeprav se to sprva zdi verjetno, v resnici ni tako. Jeziki z implicitnim upravljanjem pomnilnika imajo pogosto zbiralnike smeti, ki sprostijo nepotrebne bloke pomnilnika, vendar ti zbiralniki smeti ne delujejo vedno v času, ki ga programer pričakuje. Zanašanje na zbiralnike smeti je razmeroma nevarno in ne more vedno zaščititi programa pred napako prelivanja.

Napake prelivanja so lahko kataklizmične in ustavijo celoten program, lahko pa so skoraj tihe in omogočijo programu, da se nadaljuje naprej. Te druge vrste napak je pogosto najtežje najti, ker se lahko pojavi napaka, ki je nastala zaradi prelivanja številnih vrstic kode pred tem. Prelivanje sklada pogosto ne zahteva iskanja po celotnem programu, vendar dlje ko se lahko program izvaja po prelivanju, težje je najti in popraviti napako.