Ana içeriğe geç
Programlama

C++ tür yükseltme kuralları bitsel işlemlerde tanımsız davranış riski yaratıyor

Öne çıkanlar

  • C++ kuralları gereği ~true ifadesi bool türüne dönüştürüldüğünde standartta true değerini veriyor.
  • gcc derleyicisi bool tabanlı enum türlerinde dönüşüm standardını uygulamayıp değeri en düşük bite göre kırpıyor.
  • Temel türü belirtilmemiş serbest enum yapılarında aralık dışı tür dönüşümleri tanımsız davranış oluşturuyor.

C++ standart komitesine sunulan P4313R1 numaralı bit maskesi önerisi, dildeki tamsayı tür yükseltme mekanizmasının ve enum yapılarının oluşturduğu güvenlik açıklarını gündeme getirdi. Dilde int türünden daha küçük tamsayılar üzerinde bitsel işlem yapıldığında bu değerler zorunlu olarak int seviyesine yükseltiliyor. Bu kural özellikle bool tabanlı yapılar üzerinde çalışırken ve bit tümleme işlemi uygulandığında beklenmeyen sonuçlar doğuruyor.

Bir bool değeri tümleme işlemine girdiğinde önce int türüne yükselerek 1 oluyor, ardından ikiye tümleyen aritmetiği gereği -2 değerini alıyor. Bu değer yeniden bool türüne dönüştürüldüğünde sıfır harici tüm sayılar doğru kabul edildiği için sonuç tekrar true olarak kalıyor. Bununla birlikte gcc derleyicisinin bool tabanlı numaralandırmalarda standart kuralı uygulamayarak en düşük bite göre maskeleme yaptığı ve false sonucu ürettiği ortaya çıktı. Bu farklılık standart uyumsuzluğuna neden oluyor.

Sabit bir temel türe sahip olmayan serbest enum tanımlarında ise geçerli değer aralığı enum elemanlarının gerektirdiği en küçük bit genişliğine göre sınırlandırılıyor. Bitsel işlemler sonucunda ortaya çıkan ve bu aralığın dışına taşan değerlerin yeniden enum türüne dönüştürülmesi programda tanımsız davranışa yol açıyor. Geliştiriciler bu tür risklerden kaçınmak için C++ kavramları üzerinden tür denetimleri eklenmesini ve öneri metninin bu doğrultuda güncellenmesini talep ediyor.

Kaynak

Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.