Muistialueen ylitys

Wikipedia
Loikkaa: valikkoon, hakuun

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.

Esimerkkejä[muokkaa | muokkaa wikitekstiä]

Seuraava ANSI C -esimerkki aiheuttaa suojattua muistia käyttävissä järjestelmissä virheen.

 char *s = "string";
 *s = 'a';

Suojaamattomissa järjestelmissä tämä asettaa osoittimen s osoittaman merkkijonon ensimmäiseen muistipaikkaan merkin 'a'. Suojatussa tilassa toimivissa järjestelmissä ohjelman merkkijonoliteraali puolestaan sijaitsee ohjelmakoodiosiossa; ohjelmakoodin muistisivut on kirjoitussuojattu, ja ohjelma ei pysty muuttamaan itseään.

Esimerkki nollaosoittimesta:

 char *s = 0;
 *s = 'a';

Osoitinmuuttuja osoittaa muistipaikkaan 0, joka ei ole ohjelmissa kirjoitettavissa; tämä muistipaikka on myös sovittu tarkoittavan "osoitin ei osoita minnekään".

Tämä tietotekniikkaan liittyvä artikkeli on tynkä. Voit auttaa Wikipediaa laajentamalla artikkelia.