Грешка сегментације
Грешка сегментације (енгл. segmentation fault, често скраћено segfault) је посебан тип стања које може да се јави током извршења рачунарског програма. Грешка сегментације се јавља када програм покуша да приступи меморијској локацији којој му је забрањен приступ, или покуша да приступи меморијској локацији на начин који му није дозвољен (на пример да покуша да пише на локацији на којој је дозвољено само читање, или да пребрише део оперативног система). Системи базирани на процесорима као што је Моторола 68000 оваква стања називају адресним или магистралним грешкама.
Сегментација је један од приступа управљању меморијом и заштити оперативног система. За већину примена ју је наследило страничење (енгл. paging), али се велики део терминологије у вези сегментације још увек користи - пример је управо грешка сегментације. Неки оперативни системи и даље имају сегментацију на неком логичном нивоу иако се страничење користи као главна политика за управљање меморијом.
Код униксоликих оперативних система, процес који покуша да приступи недозвољеној или неправилној меморијској адреси прима SIGSEGV сигнал. У случају Microsoft Windows оперативних система, у таквом сучају процес прима STATUS_ACCESS_VIOLATION изузетак, и обично искаче прозор који тражи од корисника да пошаље извештај о грешци Мајкрософту.
Пример
[уреди | уреди извор]Следи пример ANSI C кода који би требало да произведе грешку сегментације на платформама које имају меморијску заштиту:
char *s = "hello world";
*s = 'H';
Када се програм који садржи овај код компајлира, ниска hello world се смешта у одељак програмског извршног фајла који је означен тако да је дозвољено само читање; када се програм учита, оперативни систем смести ову ниску заједно са осталим нискама и константама у одељак меморије где је дозвољено само читање а не и писање. При извршавању, променљива s се поставља да показује на адресу ниске, а затим се покушава упис карактера H на ову меморијску адресу, што изазива грешку сегментације. Компајлирање таквог програма компајлером, који приликом компајлирања не проверава додељивање локацијама које су само за читање, и његово извршавање на униксоликом оперативном систему произвешће следећу грешку при извршавању:
$ gcc segfaultPrimer.c -g -o segfaultPrimer
$ ./segfaultPrimer
Segmentation fault