Vad är ett segmentfel?
Ett segmenteringsfel är ett datorfel som uppstår när ett program försöker komma åt ett minnesområde på ogiltigt sätt. Dessa fel kan läsfel, där ett försök görs för att läsa data som inte har initialiserats korrekt, eller skrivfel, där ett program försöker skriva data till en felaktig plats i minnet. I datorparlance förkortas ofta termen till segfault. Eftersom segfel kan uppstå i både dataläsning och skrivning, kan de förekomma i olika sammanhang och med olika specifika namn, inklusive bussfel, buffertöverskridningar, sidfel och lagringsöverträdelser.
Även om ett segmenteringsfel kan skapas på vissa datorspråk lättare än andra, är segmentfel inte en del av själva datorspråket. I teorin kan vilket datorspråk som helst orsaka ett dataskrivningsfel som skapar ett segfault. Datorspråk som tillåter en programmerare att uttryckligen hantera minne, till exempel C ++, gör det möjligt för användaren att introducera oavsiktliga segelfunktioner relativt enkelt med dålig programmering. Språk som inte tillåter uttrycklig minneshantering, som Java, hanterar de flesta minnesfrågor utan programmerarens störningar, och minimerar därför segmenteringsfel genom att ge en programmerare inget sätt att medvetet komma åt områden utanför det tilldelade minnet.
Sätten 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 det här felet med. En vanlig syndare för en segfault är ett matrisöverskridningsfel, i vilket specifika data finns i kortplatser inom en viss minnesplats men programmeraren försöker få åtkomst till en plats som inte finns. Segfaults som skapas av dessa situationer är ofta svåra att hitta. Vissa datorspråk har gränskontroll, vilket förutser denna typ av fel och inte låter användaren försöka få åtkomst till en ogiltig plats.
Ett mindre vanligt sätt på vilket segfaults kan genereras uppstår när två datorspråk överför 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 lager av programmeringskod felet kommer från. Även om ett lager har implicit gränskontroll och inte tillåter segelfunktioner i 99,9% av sammanhanget, kan det vara ett mycket tidskrävande och tråkigt jobb att avgöra var felet kommer frå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 minne som tilldelas manuellt i ett program. Det är ofta svårt att göra, men att göra det korrekt ökar en programmerares chanser att skapa ett robust, felfri program.