Tanımsız durum, (İngilizceUndefined behavior) 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 ifade 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 optimizasyonlar yapılabilir, verimliliği artırılabilir ancak bu programın güvenilirliğini ve stabilitesini etkilemektedir ayrıca derleyicinin bir sürümünde istenen sonucu veren program, başka bir sürümde veya başka bir derleyicide farklı bir sonucu verebilir. Tanımsız durum bazen fark edilmeden bazı kütüphaneler kullanılırken de gerçekleşebilir zira bazı kütüphaneler, bir işaretçinin değerinin NULL olup olmadığını performans nedeni ile kontrol etmez.

Örnekler

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

Kaynakça

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