29 Kasım 2013 Cuma

C'de Undefined-Unspecified-İmplementation Dependent Behavior Kavramları

    Geçen gün araştırmak isterken bu kavramların genelde C derslerinde pek geçmediğini farkettim. İnternette yapılan C dersleri genelde "if else while for ve bitti" şeklinde. Fakat malesef C yapacağınız en ufak hatayı affetmeyecek türden bir dil derleyiciden geçip hata alma olasılığınız veya programınızın doğru çalışmama olasılığı var. Bu nedenle C 'nin standartlarını okumakta en azından bir özetine bakmakta fayda var. Fonksiyon dökümantasyonlarını incelemekte de fayda var (bkz. Strtok fonksiyonu dökümantasyonu) veya Standart C Library diyerek internette arattığınızda kitabı veya pdf versiyonunu edinebilirsiniz. Gelelim C 'de yapmamamız gereken araştırmamız gereken hatalara. Bu kavramlar şunlardır; Undefined Behavior, Unspecified Behavior, İmplementation Dependent Behavior. Şimdi bunları şöyle bir özetleyelim.

Undefined Behavior : Bu kavramda yazdığınız program syntax olarak tamamen legaldir fakat tanımsız davranışa yol açan bir kod elde etmiş olursunuz. Bu olayın en tehlikeli kısmı derleyicinin size herhangi bir hata vermemesidir (Warning ile uyarabilir) ayrıca derleme aşaması başarıyla geçilir. Fakat Runtime'da programın hiç bir garantisi yoktur çökebilir pointer işlemlerinde daha kötü sonuçlar doğurabilir. Bu konuda örnekler verirsek.

String Lateral'lerin değiştirilmesi!

char *s = "guven";
s[0] = 'a';     //Undefined Behavior

Atanmamış pointer'ı dereferens etmek!

int *ptr;
int x;
x = *ptr; //Undefined Behavior

Undefined behavior'lar C Standartlarında belirtilmişlerdir.

Unspecified Behavior: Bu kavramda sonuçları bellidir fakat bir kaç tanedir. Yani özetlersek bu durumları göz önüne alarak program yazmak hatadır. Bu kavramda durumlar derleyiciye göre değişkenlik gösterebilir ve derleyici yazanlar hangi seçeneği seçtiklerini dökümante etmek zorunda değildirler. Bu konuda C99 Standartları belgesinde verilen bir örneği kullanmak istiyorum. "Argümanların parametrelere kopyalanma sırası sağdan sola soldan sağa olabilir." Burada dikkat edilmesi gereken nokta " , " operatörünün yan etki noktası görevi görüp görmeyeceği yani örnekle açıklarsak ;

int foo(int, int);

//fonsiyon çağırısı

foo(x, x++);

şeklinde olursa ++ operatörünün görevini tamamlayıp tamamlayamayacağı tamamen derleyiciye bağlıdır. Kopyalamaya sağdan başlarsa artış olur soldan başlarsa artış olmaz.

İmplementation Dependent Behavior: Bu kavram unspecified behavior'ın belgelenmiş hali olarak tanımlanabilir. Durumun bir kaç sonucu vardır bu sonuç derleyiciyi yazana bırakılmıştır fakat derleyiciyi yazanlar bu durumları dökümante etmek zorundadırlar. Örnek olarak işaretli sayıda sağdan ötelemede işaret bitinin korunması İmplementation Dependent Behavior'dır.

Bu yazımızın da sonuna gelmiş bulunmaktayız umarım yazım sizlere faydalı olabilmiştir. Bu blogda artık if else yerine C 'nin ve programlamanın daha farklı kısımlarını anlatmaya çalışacağım tabi ki elimden geldiğince :) Bir hatam var ise affola teşekkürler.


Hiç yorum yok:

Yorum Gönder