Co je to přetečení zásobníku?
Přetečení zásobníku je chyba programování, při níž se pokus o zapisování dat do konkrétního bloku paměti selže, protože v bloku nezůstane žádný prostor. K tomuto typu chyby dochází stejným způsobem jako přetečení vyrovnávací paměti, přetečení haldy a přetečení vyrovnávací paměti zásobníku. Rozdíl mezi těmito typy chyb závisí na použité struktuře počítačových dat a běžným rysem je to, že k pokusu o psaní více dat, než je k dispozici, je k dispozici. V C ++ se přetečení zásobníku často projevuje jako chyba segmentace a často neexistují žádné další informace, které by určily, kde a jak došlo k přetečení. Přetečení v Javě často vede k havárii virtuálního stroje, která rozdává přiměřeně podrobný soubor chyb. Bez ohledu na jazyk, ve kterém dochází k přetečení, může být přetečení téměř vždy opraveno správnýmladění a identifikace původního zdroje přetečení.
Počítačové jazyky, které nabízejí explicitní správu paměti, je často snadnější chránit před přetečením zásobníku. Široce přijímaná programovací praxe obvykle diktuje, že pro každý segment paměti, který program přiděluje, by se měl program také smazat. C ++ umožňuje tento mechanismus a pečlivé monitorování tímto způsobem může udržet množství paměti, kterou program používá na minimu. Jazyky, které nenabízejí explicitní správu paměti a místo toho používají implicitní správu paměti, je obtížnější chránit před chybami přetečení zásobníku. Java zpracovává svou vlastní paměť ve svém virtuálním počítači, takže data nelze výslovně smazat podle libosti, aby se vytvořila prostor pro více.
Běžnou chybou začínajících programátorů je předpokládat, že v počítačových jazycích, které zpracovávají jejich vlastní správu paměti, nemůže dojít k přetečení zásobníku. I když se to zdá PlausibNejprve to tak není. Jazyky s implicitním správou paměti mají často sběratele odpadků, které zdarma zbytečné bloky paměti, ale tyto sběratelé odpadků ne vždy fungují v době, kdy programátor očekává. Spoléhání se na sběratele odpadků je relativně nebezpečné a nemůže vždy chránit program před chybou přetečení.
Chyby přetečení mohou být kataklyzmatické a zastavit celý program, nebo mohou být téměř ticho a umožnit programu pokračovat dále. Tyto druhé typy chyb jsou často nejtěžší najít, protože může dojít k chybě, která pocházela z přetečení mnoha řádků kódu dříve. Přetečení zásobníku často nevyžaduje vyhledávání celým programem, ale čím déle může program spustit po přetečení, tím obtížnější může být chyba najít a opravit.