Mis on segmenteerimisviga?

Segmenteerimisviga on arvutitõrge, mis ilmneb siis, kui programm üritab vigasel viisil juurdepääsu mälupiirkonnale. Need vead võivad olla lugemisvead, mille puhul üritatakse lugeda andmeid, mis ei ole korralikult lähtestatud, või kirjutamisvead, kus programm üritab kirjutada andmeid mälus valesse kohta. Arvutikeeles lühendatakse seda terminit sageli segfaultiks. Kuna segtõrked võivad ilmneda nii andmete lugemisel kui ka kirjutamisel, võivad need esineda erinevates kontekstides ja erinevate konkreetsete nimedega, sealhulgas siini vead, puhvri ületäitmised, lehe vead ja salvestushäired.

Kuigi segmenteerimisvea saab mõnes arvutikeeles hõlpsamini luua kui teistes, ei kuulu segmenditõrked arvutikeelte endi hulka. Teoreetiliselt võib mis tahes arvutikeel põhjustada andmete kirjutamise tõrke, mis põhjustab segfaulti. Arvutikeeled, mis võimaldavad programmeerijal selgesõnaliselt mälu käsitseda (nt C++), võimaldavad kasutajal kehva programmeerimisega suhteliselt hõlpsalt sisse viia tahtmatuid segrikkeid. Keeled, mis ei võimalda selgesõnalist mäluhaldust, nagu Java, lahendavad enamiku mäluprobleeme ilma programmeerija sekkumiseta ja minimeerivad seetõttu segmenteerimisvigu, andes programmeerijale võimaluse sihipäraselt juurde pääseda väljaspool eraldatud mälu asuvatele aladele.

Programmeerija segmenteerimisvea tekitamise viisid varieeruvad olenevalt andmete kasutamise viisist. On teatud konstruktsioone, millega on seda viga lihtsam luua. Segfaulti üks levinumaid süüdlasi on massiivi ületäitumise viga, mille puhul konkreetse mälukoha pesades sisalduvad konkreetsed andmed, kuid programmeerija proovib pääseda juurde pesale, mida pole olemas. Nendest olukordadest tekkinud segrikkeid on sageli raske üles leida. Mõnes arvutikeeles on piiride kontroll, mis näeb seda tüüpi tõrkeid ette ega lase kasutajal proovida juurdepääsu kehtetule pesale.

Vähem levinud viis segfaultide genereerimiseks on siis, kui kaks arvutikeelt edastavad puhverserveri abil andmeid üksteise vahel. Selles kontekstis on segmenteerimisviga eriti raske diagnoosida, kuna alati pole selge, millisest keelest või programmeerimiskoodi kihist viga pärineb. Isegi kui ühel kihil on kaudsete piiride kontroll ja see ei luba segfaulte 99.9% kontekstidest, võib vea päritolu kindlakstegemine olla väga aeganõudev ja tüütu töö.

Parim viis segmenteerimisvigade vältimiseks on olla mäluhaldusega väga ettevaatlik. Enamik häid programmeerimistavasid soovitab kasutajatel selgesõnaliselt vabastada iga baidi mälust, mis programmis käsitsi eraldatakse. Seda on sageli raske teha, kuid selle korrektne tegemine suurendab programmeerija võimalusi luua töökindel ja vigadeta programm.