Tanımsız durum

Vikipedi, özgür ansiklopedi

Tanımsız durum, programlamada bir standartın bir durumu tanımlayamacağı durumlara denmektedir.

C topluluklarında tanımsız durum bazen mizahi bir yolla "Nasal Demons" (Burun Şeytanları) olarak ifaade edilir zira tanımsız durumun sonucunda ne olacağı belli değildir ve bu programcının burnundan şeytanların fışkırmasını dahi "mümkün" kılmaktadır.[1]

Tanımsız durum her zaman bir programlama hatası değildir ve bazı durumlarda program tanımsız durum kullanılarak optimize edilebilir, verimliliği artırılabilir ancak bu programın güvenilirliğini ve stabilitesini etkilemektedir ayrıca derleyeicinin bir sürümünde istenen sonucu veren program başka bir sürümde veya başka bir derleyicide başka bir sonucu verebilir. Tanımsız durum bazen fark edilmeden bazı kütüphaneler kullanılırkende gerçekleşebilir zira bazı kütüphaneler NULL olup olmadığını performans nedeni ile kontrol etmez.

Örnekler[değiştir | kaynağı değiştir]

C programlama dilindeki yaygın tanımsız durumlar ise: sayı aşımı, bellek dışına okuma/yazma, bellek güvenliğine aykırı durumlar.

Düz dizenin değiştirilmesi tanımsız duruma yol açar:[2]

char *p = "vikipedi"; /* C programlama dilinde doğru, C++98/C++03'te kullanılmaması gerektiği belirtilmekte, C++11'den beri doğru bulunmaz */
p[0] = 'V'; /* tanımsız durum zira düz dizeler sadece okunurdur */

Bir tam sayının sıfırla bölünmesi tanımsız durumdur:[3]

int x = 1;
return x / 0; /* tanımsız durum */

Bazı işaretçi işlemleri tanımsız durumla sonuçlanabilir:[4]

int arr[4] = {0, 1, 2, 3};
int *p = arr + 5;  /* tanımsız durum sınır dışına gitme */
p = NULL;
int a = *p;        /* tanımsız durum NULL'un değerini öğrenmek */

Negatif bir sayıya mantıksal işlemler (sol kaydırma) uygulama, bir veri tipinin bit sayısından fazla kaydırma:

int x = -1 << 1;
/* 64 bit tam sayıyı 64 ile kaydırmak tanımsız durumdur, maksimum 63 ile kaydırılabilir */
uint64_t vikipedi = 1ULL << 64;
return x;

Değer döndürmesi gereken bir fonksiyonda değer döndürmemek:

int f()
{
}  /* eğer fonksiyonun değeri kullanılır ise tanımsız durum */

Ayrıca bakınız[değiştir | kaynağı değiştir]

Kaynakça[değiştir | kaynağı değiştir]

  1. ^ "nasal demons". Jargon File. 29 Mart 2004 tarihinde kaynağından arşivlendi. Erişim tarihi: 12 Haziran 2014. 
  2. ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §2.13.4 String literals [lex.string] para. 2
  3. ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §5.6 Multiplicative operators [expr.mul] para. 4
  4. ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §5.7 Additive operators [expr.add] para. 5