Hva er en segmenteringsfeil?
En segmenteringsfeil er en datamaskinfeil som oppstår når et program prøver å få tilgang til et minneområde på en ugyldig måte. Disse feilene kan leses feil, der det blir gjort et forsøk på å lese data som ikke er blitt initialisert riktig, eller skrive feil, der et program prøver å skrive data til et feil sted i minnet. I dataperalen blir begrepet ofte forkortet til segfault. Siden segfaults kan oppstå i både datavesning og skriving, kan de forekomme i en rekke sammenhenger og med forskjellige spesifikke navn, inkludert bussfeil, bufferoverløp, sidefeil og lagringsbrudd.
Selv om en segmenteringsfeil kan opprettes på noen dataspråk lettere enn andre, er segfaults ikke en del av dataspråk. I teorien kan et hvilket som helst dataspråk forårsake en datavirkefeil som gyter en segfault. Dataspråk som lar en programmerer eksplisitt håndtere minne, for eksempel C ++, lar brukeren introdusere utilsiktede segfaults relativty lett med dårlig programmering. Språk som ikke tillater eksplisitt minnestyring, som Java, håndterer de fleste minneproblemer uten programmererens interferens, og derfor minimerer segmenteringsfeilene ved å gi en programmerer ingen måte å målrettet få tilgang til områder utenfor allokert minne.
Måtene en programmerer kan opprette en segmenteringsfeil varierer, avhengig av måten data brukes på. Det er visse konstruksjoner som er lettere å opprette denne feilen med. En vanlig skyldig av en segfault er en array -overløpsfeil, der spesifikke data er inneholdt i spor innenfor et bestemt minneplassering, men programmereren prøver å få tilgang til et spor som ikke eksisterer. Segfaults som er gyte av disse situasjonene er ofte vanskelig å spore opp. Noen dataspråk har grenser for å sjekke, som forventer denne typen feil og ikke lar brukeren prøve å få tilgang til et ugyldigID -spor.
En mindre vanlig måte som segfaults kan genereres oppstår når to dataspråk passerer data mellom hverandre ved bruk av en proxy. I denne sammenhengen er en segmenteringsfeil spesielt vanskelig å diagnostisere fordi det ikke alltid er klart hvilket språk eller lag med programmeringskode feilen kommer fra. Selv om ett lag har implisitte grenser og ikke tillater segfaults i 99,9% av sammenhenger, kan det være en veldig tidkrevende og kjedelig jobb for å avgjøre hvor feilen kom fra.
Den beste måten å unngå segmenteringsfeil er å være veldig forsiktig med minnestyring. De fleste gode programmeringspraksis anbefaler at brukere eksplisitt skal frigjøre alle byte av minne som manuelt tildeles i et program. Dette er ofte vanskelig å gjøre, men å gjøre det øker riktig programmerers sjanser til å lage et robust, feilfritt program.