Segmenteringsfejl

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 12. december 2013; checks kræver 24 redigeringer .

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 .

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 .

Eksempel

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 programmerOpenBSD 4.0 producerer følgende runtime fejl:

$ gcc segfault.c -g -o segfault $ ./segfault Segmenteringsfejl

Output 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 placering

De 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:

  • nul pointer,
  • markøren peger på en vilkårlig placering i hukommelsen (måske fordi den ikke blev initialiseret ),
  • markøren peger på den eksterne hukommelsesplacering.

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.

Se også

Noter

  1. NTSTATUS  . _ Hentet 27. januar 2022. Arkiveret fra originalen 27. januar 2022.

Links