Mis on virna ületäitumine?

Pinu ületäitumine on programmeerimisviga, mille puhul katse teatud mäluplokki andmeid kirjutada ebaõnnestub, kuna plokis ei ole enam ruumi. Seda tüüpi tõrked ilmnevad samamoodi nagu puhvri ületäitumine, kuhja ületäitumine ja virna puhvri ületäitumine. Seda tüüpi vigade erinevus sõltub kasutatavast arvuti andmestruktuurist ja ühine joon on see, et üritatakse kirjutada rohkem andmeid, kui on nende hoidmiseks vaba ruumi.

Viru ületäitumise sümptomid võivad olenevalt kasutatavast arvutikeelest ja saadaolevast veateatemasinast erineda. C++ puhul väljendub pinu ületäitumine sageli segmenteerimisveana ja sageli ei anta lisateavet, et määrata, kus või kuidas ületäitumine juhtus. Java ületäitumine põhjustab sageli virtuaalmasina krahhi, mis annab välja piisavalt üksikasjaliku veafaili. Sõltumata keelest, milles ületäitumine toimub, saab ületäitumist peaaegu alati parandada korraliku silumise ja algse ülevooluallika tuvastamise abil.

Selget mäluhaldust pakkuvaid arvutikeeli on sageli lihtsam virna ületäitumise eest kaitsta. Laialdaselt tunnustatud programmeerimispraktika näeb tavaliselt ette, et iga programmi eraldatud mälusegmendi jaoks peaks programm ka ennast kustutama. C++ võimaldab seda mehhanismi ja sellisel viisil hoolikas jälgimine võib hoida programmi kasutatava mälumahu miinimumini. Keeli, mis ei paku selgesõnalist mäluhaldust ja kasutavad selle asemel kaudset mäluhaldust, on virna ületäitumise vigade eest keerulisem kaitsta. Java haldab oma mälu oma virtuaalmasinas, nii et andmeid ei saa soovi korral selgesõnaliselt kustutada, et rohkematele ruumi teha.

Algajate programmeerijate tavaline viga on eeldada, et pinu ületäitumist ei saa juhtuda arvutikeeltes, mis tegelevad nende mäluhaldusega. Kuigi see tundub esmapilgul usutav, pole see tegelikult nii. Kaudse mäluhaldusega keeltes on sageli prügikogujad, mis vabastavad mittevajalikud mäluplokid, kuid need prügikogujad ei tööta alati programmeerija eeldatud ajal. Prügikogujatele lootmine on suhteliselt ohtlik ja see ei suuda alati programmi ülevooluvea eest kaitsta.

Ülevooluvead võivad olla kataklüsmilised ja peatada kogu programmi või olla peaaegu vaiksed ja lubada programmil edasi liikuda. Neid teist tüüpi vigu on sageli kõige raskem leida, kuna võib ilmneda viga, mis tulenes paljude koodiridade ületäitumisest. Viru ületäitumine ei nõua sageli kogu programmi otsimist, kuid mida kauem saab programm pärast ületäitumist töötada, seda keerulisem on viga leida ja parandada.