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
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.
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