Segmentation Fault Hakkında
Programlamaya yeni baslayan biri icin, can sıkıcı kafa yedirten ve bir o kadar öğretici bir hatadır segmentation fault. Bir süre sonra programınızın bu hatayı almadan çalıştıgını görmek ilerleme kaydettiğinizi ciddi anlamda gösterir.
C ile ilk “Merhaba Dunya” uygulamamıı yazabildikten kısa bir süre sonra, bilgisayar programının genel yapısını öğrenmemi sağlayan bu hata malesef yeni programcı arkadasların korkulu ruyası olmaya devam ediyor
Bu korkuyu tasıyan biri iseniz, asağıda bahsedecegim “segmentation fault” alma sebeplerini okudugunuzda, artık düşmanınızı bir nebze daha tanımış biri olarak yolunuza devam edebileceksiniz
Yine C’den yola cıkalım. Kod içerigi ne olursa olsun, derlenmiş ve çalışabilir hale getirilmiş bir C programının genel yapısı aşağıdaki kısımlardan olusur.
-kod kesimi : Burada programın makina kodlarına dönüşmüş hali mevcuttur. Yazdıgınız bütün fonksiyonlar burada saklanır.
-data kesimi: Programın kullandığı yerel, global, static değişkenler, sabitler burada saklanır.
-stack kesimi: Fonksiyon parametreleri, geri donus degerleri, fonksiyon adresleri gibi gecici veriler programın bu kesimindedir.
-heap kesimi: Program icerisinde malloc/calloc/realloc gibi devingen(dynamic) bellek alma işlemleri sonucu, bu kesimden yer alırsınız.
Bu bellek modelini verdikten sonra gelelim asıl meseleye, “Segmentation Fault” neden ortaya çıkar? Aslında cok basit.. Data kesiminde bahsettigim gibi yerel, global, static degiskenler tutulmakta. Yani data kesimi de kendi icinde sadece-okunabilir(R) ve okunabilir-yazılabilir(R-W) olarak ayrılır.
int main(){
int a = 5;
char *c = “Hacettepe”
return 0;
}
Yukardaki programda iki farklı değişkenimiz mevcut. İkisi de yerel. ‘a’ adında sayısal(integer) degiskenimiz ve ‘c’ adında karakter gostericimiz(pointer). İki degiskenimizinde ilkdeğerleri var dikkat edersek. a’nın ilkdeğeri 5, c nin gosterdigi karakter dizisinin değeri ise “Hacettepe”. Program çalıştığında degiskenlere cok guzel bir sekilde bu değeri verebiliyor degil mi? Peki bunu nereden biliyor? İşte yukarda bahsettiğim data kesiminin sadece-okunabilir kısmına bu sabitler kaydedilir. Bu işlem derleme-bağlama(build) aşamasında gerçekleştirilir.
‘c’ gostericisi bellegin sadece okunabilir bolgesinde kayıtlı, ‘Hacettepe’ değerine sahip dizinin baslangıc adresinin degerine sahip. Bu adresin sayısal degerinin bizim için bir anlamı yok. Sadece ve sadece bilmemiz gereken, bu adresin bellegin sadece-okunabilir adres evreni icerisinde kaldığı.
Peki sadece-okunabilir dedik, iyi guzel de, bir sey yazarsak nolur? İşte o zaman sevgili “Segmentation Fault” ile tanışmış olursun
Tanım yapacak olursak genel anlamda “Segmentation Fault”, önceden yazmaya karşı korumalı olarak ayrılmış bellegin bir kesimine yazma işlemini gerçekleştirememe hatasıdır. Bu bellek yukarda bahsettigim gibi sabitlerin saklandığı programınızın kendi belleği, veya baska bir programın bellegi yahut da işletim sistemine ayrılmış bir bellek alanı olabilir. Bir kac ornek verelim o halde
char *c = “Emre Gurbuz”;
strcpy(c, “Egurbuz”);
“Emre Gurbuz” bellegin okunabilir kesiminde, üzerine “Egurbuz” değerini yazmaya kalkiyoruz ve hatamizi aliyoruz tabiki..
int *p;
*p = 2009;
Yukarıda int *p ile bir gosterici degiskeni oluşturduk. ilk değer vermediğimiz icin derleyici tarafından 0 degeri atandı. 0, null demek biliyoruz. İkinci satırda bu gostericinin gosterdigi bellege 2009 sayısını yazmaya çalışırsak yine o malum hatayı alırız.
Segmentation Faultu almamak adına program içerisindeki değişkenler, bunların ömürleri ve tipleri hakkında bilgili olmalısınız. malloc ile ayırdıgınız bir bellek yazılabilir/okunabilir dir. Malloc fonksiyonu başarılı bir şekilde calıştıysa korkmanıza gerek yok
Null pointerlara dikkat göstermelisiniz. Gerekli yerlerde null pointer kontrolunuzu yapmalı, algoritmanızı bu hatayı engelliyecek şekilde kurmalısınız.
Şimdilik bu kadar…Segmentation Fault’tan kısaca bahsetmek istedim bu yazıda, çünkü çok karşılaşılan ve iyice anlaşılmadan geçilen bir konu oldugunu düşünüyorum. Umarım az da olsa korkunuz azalmıştır
Çok teşekkür ederim hocam. Artık segmentation fault korkuyor benden:)