Felosztási hiba

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt hozzászólók, és jelentősen eltérhet a 2013. december 12-én felülvizsgált verziótól ; az ellenőrzések 24 szerkesztést igényelnek .

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 .

Példa

Í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 hiba

A 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ése

Az 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 () { (); }

A szegmentálási hiba általában az alábbiak miatt következik be:

  • null mutató,
  • a mutató egy tetszőleges helyre mutat a memóriában (talán azért, mert nem volt inicializálva ),
  • a mutató a távoli memóriahelyre mutat.

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.

Lásd még

Jegyzetek

  1. NTSTATUS  . _ Letöltve: 2022. január 27. Az eredetiből archiválva : 2022. január 27.

Linkek