Tanımsız Davranış (UB) — C dilinin standardının programın sonucu ile ilgili tanımlayıcı bir bilgi vermediği bir durumdur. Derleyici veya sistem herhangi bir eylemi gerçekleştirebilir - göz ardı edilen bir hata ile tamamen çökmeden veri bozulmasına kadar.
UB'nin yaygın nedenleri:
UB'yi nasıl minimize edebiliriz:
int arr[5]; arr[10] = 0; // UB — dizi sınırının dışına çıkma int* p = NULL; *p = 42; // UB — NULL işaretçisinin derecelendirilmesi
Soru: Bir tam sayıyı sıfıra bölersek program ne yapar?
Cevap: C standardına göre (ISO C99 6.5.5), 0'a bölmek tanımsız bir davranıştır. Çökme, rastgele veriler veya "mantıken doğru" bir çıktı meydana gelebilir, ancak standart garanti edilen hiçbir sonuç vermemektedir.
int a = 10, b = 0; printf("%d", a / b); // Tanımsız davranış
Hikaye
Gömülü sistemler üzerine olan bir projede bir programcı dizinin boyutunun bir elemanını dikkate almadan bir döngü yazdı. Uygulama normal çalıştı, fakat bir ay sonra bellek içindeki diğer verilere zarar vermeye başladı (kısa süreli hatalar, yeniden üretilmesi zor). Sorun ancak dikkatli bir gözden geçirme ve statik analiz aracı ile kontrol sonrası bulundu.
Hikaye
Geliştirici, NULL işaretçisinin derecelendirilmesinin her zaman bir çökme ile sonuçlanacağını varsayıyordu, bu nedenle NULL kontrolleri eklemedi. Ancak nadir bir platformda, bu geçersiz (ama ölümcül olmayan) bellek değişikliklerine neden oldu ve diğer yapıları bozarak yeniden üretilmesi zor hatalara yol açtı.
Hikaye
Pseudorastgele sayıların üretilmesinde bölme kullanıldı ve bazı giriş argümanları için sıfıra bölme gerçekleşti. Çoğu platformda program "çöktü", ancak bunlardan birinde sonuç geçersiz bir sayı oldu ve bu da farklı ortamlar arasında hataların yeniden üretilmesini imkansız hale getirdi.