Tanımsız davranış
Bilgisayar programlamada, tanımsız davranış (İngilizce: Undefined behavior), kaynak kodunun yazıldığı programlama dilinin dil belirtiminde davranışı öngörülemez olarak öngörülen bir programın yürütülmesinin sonucudur. Bu, dil belirtiminin bir sonuç öngörmediği belirtilmemiş davranıştan ve platformun başka bir bileşeninin (ABI veya çevirmen belgeleri gibi) belgelenmesine başvuran uygulama tanımlı davranıştan farklıdır.
C programlama topluluğunda, tanımsız davranışlar comp.std.c'de derleyicinin istediği her şeyi yapmasına, hatta "burnunuzdan şeytanlar uçmasına" bile izin veren tanımsız davranışların açıklanmasından sonra esprili bir şekilde "burun şeytanları" olarak adlandırılabilir.[1]
Örnekler
değiştirC programlama dilindeki yaygın tanımsız davranışlar 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 davranışa 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 davranış zira düz dizeler sadece okunurdur */
Bir tam sayının sıfırla bölünmesi tanımsız davranıştır:[3]
int x = 1;
return x / 0; /* tanımsız davranış */
Bazı işaretçi işlemleri tanımsız davranışla sonuçlanabilir:[4]
int arr[4] = {0, 1, 2, 3};
int *p = arr + 5; /* tanımsız davranış sınır dışına gitme */
p = NULL;
int a = *p; /* tanımsız davranış 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 davranıştır, 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 davranış */
Ayrıca bakınız
değiştirKaynakça
değiştir- ^ "nasal demons". 17 Temmuz 2014 tarihinde kaynağından arşivlendi. Erişim tarihi: 11 Kasım 2022.
- ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §2.13.4 String literals [lex.string] para. 2
- ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §5.6 Multiplicative operators [expr.mul] para. 4
- ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §5.7 Additive operators [expr.add] para. 5