Tanımsız davranış (UB, undefined behavior) — standartların belirlemediği kod içindeki eylemlerdir. Bu durumda derleyici, her türlü kararı verme özgürlüğüne sahiptir: program farklı platformlarda, derleyicilerde farklı çalışabilir veya hatta nükleer bir savaşı başlatabilir (resmi olarak!). UB kullanımı, C++'daki en tehlikeli hatadır.
UB örnekleri:
int* p = new int[2]; delete[] p; int x = p[1]; // UB: serbest bırakıldıktan sonra bellek erişimi
UB'yi önlemek için:
Aşağıdaki kodda ne olacak?
int a = 42; int b = a++ + ++a;
b'nin değeri ne olacak?
Cevap:
Bu kod UB'yi tetikler çünkü a değişkenini okuma ve değiştirme işlemleri arasında sıralama noktaları (sequence points) yoktur. Standart, belirli bir sonucu garanti etmez ve derleyici herhangi bir sonuç alabilir ya da hatta beklenmeyen kod üretebilir.
Hikaye Veri depolama sistemi projesinde, geliştiricilerden biri düşük seviyeli bir işlevde dizi dışına erişim sağladı. UB, yalnızca belirli kullanıcı verileri üzerinde ortaya çıkıyordu ve dosya yapısının bozulmasına ve müşteri verilerinin kaybına yol açıyordu.
Hikaye Mikrodenetleyici projesinde, başlatılmamış değişkenlerin okunmasıyla ilgili yapılarla karşılaşıldı. Testler geçiyordu ama bir yıl sonra cihazın piyasaya çıkmasından sonra, UB nedeniyle rastgele hata belirtileri ortaya çıktı: değişkenler bazen görüntü kirleticisi değerler içeriyordu.
Hikaye Büyük bir açık kaynak projesinde, farklı kod bölümlerinden iki kez serbest bırakılan bir tanıtıcı tespit edildi. Bu UB başlangıçta nadir bir şekilde ortaya çıktı, ancak yeni işletim sistemi versiyonlarında sık sık acil duruşlar yaşanmasına neden oldu.