ProgramlamaC geliştirici

C dilinde 'tanımsız davranış' nedir? Ortaya çıkma örnekleri ve bu tür sorunları minimize etme yollarını belirtiniz.

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

Cevap.

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:

  • Dizi sınırlarının dışına erişim
  • Başlatılmamış/geçersiz bir işaretçinin derecelendirilmesi
  • 0'a bölme
  • Sabitlerin değiştirilmesi

UB'yi nasıl minimize edebiliriz:

  • Değişkenleri her zaman başlatın
  • Dizi indekslerini kontrol edin
  • Statik ve dinamik kod analiz araçları kullanın (örneğin, valgrind, AddressSanitizer)

Kod örneği:

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

Tuzaklı Soru.

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.

Kod örneği:

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.