A szegmentációs hiba ( eng. Segmentation fault , röv. segfault , jarg . segfault) egy szoftverhiba , amely akkor fordul elő, amikor olyan memóriaterületekhez próbál hozzáférni , amelyek íráshoz nem hozzáférhetők, vagy ha tiltott módon próbálja megváltoztatni a memóriát. A Motorola 68000 processzorokon alapuló rendszereken ezeket a hibákat általában cím- vagy buszhibáknak nevezik .
UNIX - szerű operációs rendszereken az érvénytelen memóriát elérő folyamatok kapják a SIGSEGV jelet . Microsoft Windows rendszeren az érvénytelen memóriát elérő folyamat STATUS_ACCESS_VIOLATION kivételt dob (a 0xC0000005 [1] kód definíciója ) , és általában felszólítja az alkalmazás hibakeresőjét, hogy futtasson, és egy ablakot jelenít meg a felhasználónak, amelyben hibajelentést küld a Microsoftnak .
Íme egy példa az ANSI C kódra, amely típusminősítő jelenléte miatt szegmentációs hibát eredményez const:
const char * s = "helló világ" ; * ( char * ) s = 'H' ;Az ezt a kódot tartalmazó program lefordításakor a sor egy bináris csak olvasható jelöléssel "hello world"kerül a programrészbe . Indításkor az operációs rendszer más karakterláncokkal és konstansokkal együtt a memória csak olvasható szegmensébe helyezi. A lefutás után a változó a karakterlánc kezdetének címére mutat , és egy karakterállandó értékének a memóriában lévő változón keresztül történő hozzárendelése szegmentációs hibát eredményez. s 'H'
Az ilyen programok OpenBSD 4.0 -n történő fordítása és futtatása a következő futásidejű hibát eredményezi:
$ gcc segfault.c -g -o segfault $ ./segfault Szegmentációs hibaA gdb hibakereső kimenete :
Program vett jel SIGSEGV, Szegmentációs hiba. 0x1c0005c2 in main() at segfault.c:6 6 *s = 'H';Ezzel szemben a GCC 4.1.1 GNU/Linux rendszeren a fordítás során hibát ad vissza :
$ gcc segfault.c -g -o segfault segfault.c: A 'main' függvényben: segfault.c:4: hiba: csak olvasható hely hozzárendeléseAz operációs rendszertől függ, hogy milyen feltételek mellett fordulnak elő szegmentálási megsértések, és hogyan nyilvánulnak meg .
Ez a kódpélda nullmutatót hoz létre, és megpróbál értéket rendelni egy nem létező címhez. Ez sok rendszeren szegmentációs hibákat okoz a programvégrehajtás során .
int * ptr = ( int * ) 0 ; * ptr = 1 ;A szegmentálási hiba másik módja a függvény main() rekurzív meghívása , ami veremtúlcsordulást eredményez :
int main () { fő (); }A szegmentálási hiba általában az alábbiak miatt következik be:
Például,
char * p1 = NULL ; /* nullára inicializálva; ez megengedett, de sok rendszeren nem lehet rá hivatkozni */ char * p2 ; /* egyáltalán nincs inicializálva (tetszőleges címre mutat a memóriában) */ char * p3 = ( char * ) malloc ( 20 ); /* OK, memória lefoglalva */ szabad ( p3 ); /* de most eltűnt */Ezen mutatók bármelyikének hivatkozás megszüntetése szegmentációs hibát okozhat.
Vagy tömbök használatakor, ha véletlenül egy inicializálatlan változót ad meg egy tömb méreteként :
int main () { const int nmax = 10 ; int i , n , a [ n ]; }A G++ fordító nem követi ezt a hivatkozási hibát , ami szegmentációs hibát okozhat a lefordított program futtatásakor.
Az operációs rendszerek szempontjai | |||||
---|---|---|---|---|---|
| |||||
Típusok |
| ||||
Sejtmag |
| ||||
Folyamatmenedzsment _ |
| ||||
Memóriakezelés és címzés | |||||
Betöltési és inicializálási eszközök | |||||
Héj | |||||
Egyéb | |||||
Kategória Wikimedia Commons Wikikönyvek Wikiszótár |