Skip to main content

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.

Příznaky přetečení zásobníku se mohou lišit v závislosti naPoužitý jazyk počítače a dostupné stroje na hlášení chyb.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ým laděním a identifikací původního zdroje přetečení.Š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 podle libosti výslovně smazat, 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 nemůže dojít k přetečení zásobníku, které zpracovávají jejich vlastní správu paměti.I když se to zpočátku zdá být věrohodné, ve skutečnosti tomu 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, aby program pokračoval.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 delší program může spustit po přetečení, tím obtížnější může být chyba najít a opravit.