ProgramlamaSistem Geliştirici, Backend Geliştirici

C++'da tanımsız davranış (undefined behavior) nedir ve neden bu kadar tehlikelidir? Örnekler verin ve nasıl kaçınılacağını açıklayın.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Dizi dışına erişim
  • Başlatılmamış değişkenlerin kullanımı
  • Aynı bellek alanının iki kez serbest bırakılması
  • Dangling pointer'ların kullanımı
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:

  • Değişkenleri her zaman başlatın;
  • Dizi/kap konteynerlerinin sınırlarını kontrol edin;
  • Bellek yönetiminden kaçının, akıllı işaretçiler kullanın.

Aldatıcı soru.

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.

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


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.