Segmenteringsfejl ( eng. Segmentation fault , abr. segfault , jarg . segfault) er en softwarefejl , der opstår , når du forsøger at få adgang til områder i hukommelsen , der er utilgængelige til skrivning, eller når du forsøger at ændre hukommelse på en forbudt måde. På systemer baseret på Motorola 68000-processorer er disse fejl generelt kendt som adresse- eller busfejl .
På UNIX-lignende operativsystemer modtager en proces, der får adgang til ugyldig hukommelse, SIGSEGV -signalet . På Microsoft Windows vil en proces, der får adgang til ugyldig hukommelse, give en STATUS_ACCESS_VIOLATION- undtagelse (definition for kode 0xC0000005 [1] ) og vil typisk bede applikationsfejlfinderen om at køre og vise brugeren et vindue, der beder dem om at indsende en fejlrapport til Microsoft .
Her er et eksempel på ANSI C -kode , der resulterer i en segmenteringsfejl på grund af tilstedeværelsen af en typekvalifikation const :
const char * s = "hej verden" ; * ( char * ) s = 'H' ;Når programmet, der indeholder denne kode, er kompileret , placeres linjen "hello world" i programafsnittet med et binært skrivebeskyttet mærke. Ved opstart placerer operativsystemet det sammen med andre strenge og konstanter i et skrivebeskyttet hukommelsessegment. Når den er kørt, peger variablen på adressen på begyndelsen af strengen , og et forsøg på at tildele værdien af en tegnkonstant gennem en variabel i hukommelsen resulterer i en segmenteringsfejl. s 'H'
At kompilere og køre sådanne programmer på OpenBSD 4.0 producerer følgende runtime fejl:
$ gcc segfault.c -g -o segfault $ ./segfault SegmenteringsfejlOutput fra gdb - debuggeren :
Program modtaget signal SIGSEGV, Segmenteringsfejl. 0x1c0005c2 i main() ved segfault.c:6 6 *s = 'H';I modsætning hertil returnerer GCC 4.1.1 på GNU/Linux en fejl på kompileringstidspunktet :
$ gcc segfault.c -g -o segfault segfault.c: I funktion 'main': segfault.c:4: fejl: tildeling af skrivebeskyttet placeringDe forhold, hvorunder segmenteringsovertrædelser opstår, og hvordan de kommer til udtryk, afhænger af operativsystemet .
Dette kodeeksempel opretter en null-pointer og forsøger at tildele en værdi til en ikke-eksisterende adresse. Dette forårsager segmenteringsfejl under programafvikling på mange systemer .
int * ptr = ( int * ) 0 ; * ptr = 1 ;En anden måde at forårsage en segmenteringsfejl på er at kalde funktionen main() rekursivt , hvilket vil resultere i et stak-overløb :
int main () { hoved (); }Typisk opstår en segmenteringsfejl fordi:
For eksempel,
char * p1 = NULL ; /* initialiseret til null; dette er tilladt, men på mange systemer kan det ikke fraviges */ char * p2 ; /* slet ikke initialiseret (peger på en vilkårlig adresse i hukommelsen) */ char * p3 = ( char * ) malloc ( 20 ); /* OK, hukommelse tildelt */ fri ( p3 ); /* men nu er det væk */Nu kan det medføre en segmenteringsfejl at dereferere nogen af disse pointere.
Eller når du bruger arrays , hvis du ved et uheld angiver en ikke- initialiseret variabel som størrelsen af et array :
int main () { const int nmax = 10 ; int i , n , a [ n ]; }G++- kompileren sporer ikke denne sammenkædningsfejl , som kan forårsage en segmenteringsfejl, når det kompilerede program køres.
af operativsystemer | Aspekter|||||
---|---|---|---|---|---|
| |||||
Typer |
| ||||
Nucleus |
| ||||
Procesledelse _ |
| ||||
Hukommelseshåndtering og adressering | |||||
Indlæsnings- og initialiseringsværktøjer | |||||
skal | |||||
Andet | |||||
Kategori Wikimedia Commons Wikibooks Wiktionary |