Vad är ett segmenteringsfel?

Ett segmenteringsfel är ett datorfel som uppstår när ett program försöker komma åt en minnesregion på ett ogiltigt sätt. Dessa fel kan vara läsfel, där ett försök görs att läsa data som inte har initierats korrekt, eller skrivfel, där ett program försöker skriva data till en felaktig plats i minnet. På datorspråk förkortas termen ofta till segfault. Eftersom segfaults kan uppstå i både dataläsning och skrivning, kan de förekomma i en mängd olika sammanhang och med olika specifika namn, inklusive bussfel, buffertspill, sidfel och lagringsöverträdelser.

Även om ett segmenteringsfel lättare kan skapas i vissa datorspråk än andra, är segmenteringsfel inte en del av själva datorspråken. I teorin kan vilket datorspråk som helst orsaka ett dataskrivfel som skapar ett segfault. Datorspråk som tillåter en programmerare att explicit hantera minne, som C++, tillåter användaren att introducera oavsiktliga segfel relativt enkelt med dålig programmering. Språk som inte tillåter explicit minneshantering, som Java, hanterar de flesta minnesproblem utan programmerarens störningar och minimerar därför segmenteringsfel genom att ge en programmerare inget sätt att avsiktligt komma åt områden utanför tilldelat minne.

De sätt på vilka en programmerare kan skapa ett segmenteringsfel varierar beroende på hur data används. Det finns vissa konstruktioner som är lättare att skapa detta fel med. En vanlig orsak till ett segfault är ett array overflow-fel, där specifik data finns i platser inom en viss minnesplats men programmeraren försöker komma åt en plats som inte finns. Segfaults som uppstår av dessa situationer är ofta svåra att spåra. Vissa datorspråk har gränskontroll, vilket förutser denna typ av fel och låter användaren inte försöka komma åt en ogiltig plats.

Ett mindre vanligt sätt på vilket segfaults kan genereras uppstår när två datorspråk skickar data mellan varandra med hjälp av en proxy. I detta sammanhang är ett segmenteringsfel särskilt svårt att diagnostisera eftersom det inte alltid är tydligt vilket språk eller vilket lager av programmeringskod felet kommer ifrån. Även om ett lager har implicita gränskontroller och inte tillåter segfaults i 99.9 % av sammanhangen, kan det vara ett mycket tidskrävande och tråkigt jobb att avgöra var felet kom ifrån.

Det bästa sättet att undvika segmenteringsfel är att vara mycket försiktig med minneshantering. De flesta goda programmeringsmetoder rekommenderar att användare uttryckligen bör frigöra varje byte av minne som tilldelas manuellt i ett program. Detta är ofta svårt att göra, men att göra det på rätt sätt ökar en programmerares chanser att skapa ett robust, felfritt program.