Što je Stack Overflow?

Stack overflow je programska pogreška u kojoj pokušaj upisivanja podataka u određeni blok memorije ne uspije jer u bloku nema mjesta. Ova vrsta pogreške događa se na isti način kao i preljevi međuspremnika, preljevi hrpe i preljevi međuspremnika stog. Razlika između ovih tipova pogrešaka ovisi o strukturi računalnih podataka koja se koristi, a zajednička je značajka da se pokušava upisati više podataka nego što je dostupnog prostora za njihovo držanje.

Simptomi prekoračenja steka mogu varirati ovisno o korištenom jeziku računala i dostupnom mehanizmu za izvješćivanje o greškama. U C++, prelijevanje steka često se očituje kao greška segmentacije, a često se ne daju dodatne informacije koje bi odredile gdje ili kako se došlo do prelijevanja. Prelijevanje u Javi često rezultira padom virtualnog stroja koji daje razumno detaljnu datoteku pogreške. Bez obzira na jezik na kojem se događa prelijevanje, prekoračenje se gotovo uvijek može ispraviti pravilnim otklanjanjem pogrešaka i identifikacijom izvornog izvora preljeva.

Računalne jezike koji nude eksplicitno upravljanje memorijom često je lakše zaštititi od prekoračenja stogova. Široko prihvaćena programska praksa obično nalaže da za svaki segment memorije koji program dodijeli, program također treba izbrisati sam sebe. C++ dopušta ovaj mehanizam, a pažljivo praćenje na ovaj način može zadržati količinu memorije koju program koristi na minimumu. Jezike koji ne nude eksplicitno upravljanje memorijom, a umjesto toga koriste implicitno upravljanje memorijom, teže je zaštititi od grešaka prekoračenja stogova. Java rukuje vlastitom memorijom unutar svog virtualnog stroja, tako da se podaci ne mogu eksplicitno izbrisati po volji kako bi se napravio prostor za više.

Uobičajena pogreška programera početnika je pretpostavka da se prelijevanje steka ne može dogoditi u računalnim jezicima koji upravljaju vlastitim upravljanjem memorijom. Iako se ovo na prvu čini uvjerljivim, zapravo nije tako. Jezici s implicitnim upravljanjem memorijom često imaju sakupljače smeća koji oslobađaju nepotrebne blokove memorije, ali ti sakupljači smeća ne rade uvijek u vrijeme koje programer očekuje. Oslanjanje na sakupljače smeća relativno je opasno i ne može uvijek zaštititi program od greške prelijevanja.

Pogreške prekoračenja mogu biti kataklizmične i zaustaviti cijeli program, ili mogu biti gotovo tihe i dopustiti programu da nastavi dalje. Ove druge vrste pogrešaka često je najteže pronaći jer se može pojaviti pogreška koja je nastala zbog prelijevanja mnogo redaka koda prije. Prelijevanje steka često ne zahtijeva pretragu kroz cijeli program, ali što se program dulje može izvoditi nakon prekoračenja, to će pogrešku biti teže pronaći i popraviti.