Greška segmentacije

Greška segmentacije (engl. segmentation fault, često skraćeno segfault) je poseban tip stanja koje može da se javi tokom izvršenja računarskog programa. Greška segmentacije se javlja kada program pokuša da pristupi memorijskoj lokaciji kojoj mu je zabranjen pristup, ili pokuša da pristupi memorijskoj lokaciji na način koji mu nije dozvoljen (na primer da pokuša da piše na lokaciji na kojoj je dozvoljeno samo čitanje, ili da prebriše deo operativnog sistema). Sistemi bazirani na procesorima kao što je Motorola 68000 ovakva stanja nazivaju adresnim ili magistralnim greškama.

Segmentacija je jedan od pristupa upravljanju memorijom i zaštiti operativnog sistema. Za većinu primena ju je nasledilo straničenje (engl. paging), ali se veliki deo terminologije u vezi segmentacije još uvek koristi - primer je upravo greška segmentacije. Neki operativni sistemi i dalje imaju segmentaciju na nekom logičnom nivou iako se straničenje koristi kao glavna politika za upravljanje memorijom.

Kod uniksolikih operativnih sistema, proces koji pokuša da pristupi nedozvoljenoj ili nepravilnoj memorijskoj adresi prima SIGSEGV signal. U slučaju Microsoft Windows operativnih sistema, u takvom sučaju proces prima STATUS_ACCESS_VIOLATION izuzetak, i obično iskače prozor koji traži od korisnika da pošalje izveštaj o grešci Majkrosoftu.

Primer

uredi

Sledi primer ANSI C koda koji bi trebalo da proizvede grešku segmentacije na platformama koje imaju memorijsku zaštitu:

     char *s = "hello world";
     *s = 'H';

Kada se program koji sadrži ovaj kod kompajlira, niska hello world se smešta u odeljak programskog izvršnog fajla koji je označen tako da je dozvoljeno samo čitanje; kada se program učita, operativni sistem smesti ovu nisku zajedno sa ostalim niskama i konstantama u odeljak memorije gde je dozvoljeno samo čitanje a ne i pisanje. Pri izvršavanju, promenljiva s se postavlja da pokazuje na adresu niske, a zatim se pokušava upis karaktera H na ovu memorijsku adresu, što izaziva grešku segmentacije. Kompajliranje takvog programa kompajlerom, koji prilikom kompajliranja ne proverava dodeljivanje lokacijama koje su samo za čitanje, i njegovo izvršavanje na uniksolikom operativnom sistemu proizvešće sledeću grešku pri izvršavanju:

$ gcc segfaultPrimer.c -g -o segfaultPrimer
$ ./segfaultPrimer
Segmentation fault

Spoljašnje veze

uredi