Muistialueen ylitys

Muistialueen ylitys eli segmentointivirhe (engl. segmentation fault tai access violation), on tietokoneohjelmissa esiintyvä virhetilanne.

Monet ohjelmointikielet, kuten C ja C++, eivät tarkista osoittimien oikeellisuutta. Suojatussa tilassa toimiva käyttöjärjestelmä pystyy kuitenkin valvomaan, että ohjelma ei kirjoita tai lue muistialuetta, joka ei kuulu sille. Kun ohjelma yrittää käyttää sille kuulumatonta muistia, laitteisto luo tilan, jonka käyttöjärjestelmä käsittelee virhesignaalina tai poikkeuksena. Mikäli ohjelma ei käsittele sitä erikseen, käyttöjärjestelmä useimmiten pysäyttää ohjelman.

Suojaamattomassa tilassa toimivat käyttöjärjestelmät eivät aiheuta poikkeusta, mutta käytetyt ohjelmakirjastot voivat silti havaita tiettyjä selkeitä virhetilanteita, esimerkiksi nollaksi asetetun osoittimen käytön (null pointer assignment).

Unix-järjestelmissä muistialueen ylityssignaali on SIGSEGV (Segmentation fault), POSIX-standardissa signaalikoodi 11. Segmentointi-termi on jo vanhahtava: nykyaikaisissa järjestelmissä ei käytetä enää segmenttejä, vaan "muistisivuja" (page). Microsoft Windows-järjestelmä aiheuttaa poikkeuksen STATUS_ACCESS_VIOLATION (Käsky osoitteessa 0x%08lx viittasi muistiin osoitteessa 0x%08lx. Muisti ei voi olla %s. / The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.).

Useimmiten muistialueen ylitys johtuu tilanteesta, jossa osoitinmuuttujaa ei alusteta ennen käyttöä. Tällöin osoitinmuuttujan kohdetta ei ole määritelty, ja osoitinmuuttuja todennäköisesti osoittaa paikkaan, jota ohjelma ei voi lukea eikä kirjoittaa. On myös mahdollista, että se osoittaa satunnaiseen sallittuun muistiosoitteeseen, mikä johtaa usein ongelmiin.


From Wikipedia, the free encyclopedia · View on Wikipedia

Developed by Nelliwinne