Kas yra segmentavimo gedimas?

Segmentavimo klaida yra kompiuterio klaida, kuri atsiranda, kai programa bando netinkamu būdu pasiekti atminties sritį. Šios klaidos gali būti skaitymo klaidos, kai bandoma nuskaityti duomenis, kurie nebuvo tinkamai inicijuoti, arba rašymo klaidos, kai programa bando įrašyti duomenis į neteisingą atminties vietą. Kompiuterinėje kalboje šis terminas dažnai sutrumpinamas iki segfault. Kadangi gedimų gali atsirasti tiek nuskaitant, tiek rašant duomenis, jie gali atsirasti įvairiuose kontekstuose ir skirtingais konkrečiais pavadinimais, įskaitant magistralės klaidas, buferio perpildymą, puslapio klaidas ir saugojimo pažeidimus.

Nors kai kuriomis kompiuterių kalbomis segmentavimo gedimas gali būti sukurtas lengviau nei kitomis, gedimai nėra pačių kompiuterių kalbų dalis. Teoriškai bet kuri kompiuterio kalba gali sukelti duomenų rašymo klaidą, dėl kurios atsiranda segfault. Kompiuterių kalbos, leidžiančios programuotojui aiškiai tvarkyti atmintį, pvz., C++, leidžia vartotojui palyginti lengvai įvesti netyčinius gedimus, kai programuojama prastai. Kalbos, kurios neleidžia aiškiai valdyti atminties, pvz., „Java“, daugumą atminties problemų išsprendžia be programuotojo įsikišimo ir todėl sumažina segmentavimo klaidas, nesuteikdamos programuotojui būdo tikslingai pasiekti sritis, esančias už paskirtos atminties ribų.

Būdai, kuriais programuotojas gali sukurti segmentavimo gedimą, skiriasi priklausomai nuo duomenų naudojimo būdo. Yra tam tikrų konstrukcijų, su kuriomis lengviau sukurti šią klaidą. Vienas iš dažniausių segmento gedimo kaltininkų yra masyvo perpildymo klaida, kai konkretūs duomenys yra tam tikros atminties vietos lizduose, tačiau programuotojas bando pasiekti neegzistuojančią lizdą. Dėl šių situacijų atsiradusius gedimus dažnai sunku atsekti. Kai kurios kompiuterių kalbos turi ribų tikrinimą, kuris numato tokio tipo klaidą ir neleidžia vartotojui bandyti pasiekti netinkamo lizdo.

Mažiau paplitęs būdas, kuriuo galima generuoti gedimus, atsiranda, kai dvi kompiuterių kalbos perduoda duomenis viena kitai naudodamos tarpinį serverį. Šiame kontekste ypač sunku diagnozuoti segmentavimo gedimą, nes ne visada aišku, iš kurios kalbos ar programavimo kodo sluoksnio kyla klaida. Net jei vienas sluoksnis turi numanomų ribų tikrinimą ir neleidžia 99.9 % kontekstų gedimų, gali būti labai daug laiko ir varginantis darbas nustatyti, iš kur kilo klaida.

Geriausias būdas išvengti segmentavimo klaidų yra būti labai atsargiems valdant atmintį. Dauguma geros programavimo praktikos rekomenduoja, kad vartotojai turėtų aiškiai atlaisvinti kiekvieną programoje rankiniu būdu priskirtą atminties baitą. Tai padaryti dažnai sunku, bet tai darant teisingai, programuotojo tikimybė sukurti patikimą, be klaidų programą padidina.