C++ derleyici optimizasyonları tanımsız davranış nedeniyle güvenlik hatası üretiyor
Öne çıkanlar
- Kod -O0 seviyesinde beklenen sonucu verirken -O2 optimizasyonunda geçersiz izni onaylıyor.
- Hata hem Clang 19 hem de GCC 14 üzerinde C++17, C++20 ve C++23 standartlarında tekrarlanıyor.
- Davranış, geçici dize nesnelerinin kapsam dışına çıkması ve aynı karakter uzunluğuna sahip olmasıyla tetikleniyor.
C++ dilinde yazılan kodlarda tanımsız davranışların (undefined behavior) derleyici optimizasyonlarıyla birleştiğinde beklenmedik mantıksal sonuçlara yol açtığı bir örnek paylaşıldı. Yayımlanan teknik incelemede, geçici bir dize nesnesine başvuran string_view kullanımının -O2 optimizasyon seviyesinde yetkilendirme kontrolünü tamamen tersine çevirdiği gösterildi. Normal şartlarda eşleşmeyen iki farklı metin, optimizasyon bayrağı aktif edildiğinde eşit kabul edildi.
İncelemede yer alan örnek program Clang 19 ve GCC 14 derleyicileri üzerinde C++17, C++20 ve C++23 standartlarıyla test edildi. Kod -O0 bayrağıyla derlendiğinde yetkisiz kullanıcıya izin verilmezken, -O2 seviyesinde Clang ve GCC derleyicilerinin her ikisi de kullanıcıyı yöneticiyle eşit sayarak yetki tanıdı. Bu durumun arkasında, fonksiyon çağrısı sırasında oluşturulan geçici std::string nesnesinin ömrünün bitmesi ve referansın boşa düşmesi yer alıyor.
Hatanın ortaya çıkması için girdi dizesi ile karşılaştırılan yönetici kimliğinin aynı karakter uzunluğunda olması ve doğrudan parametre olarak geçilmesi gerekiyor. Değişkenlerin ömrünü uzatan veya dizeleri ayrı geçici değişkenlerde tutan küçük yeniden yapılandırma adımları bu davranışı ortadan kaldırıyor. Teknik değerlendirmede, söz konusu hatanın gerçek dünya projelerinde doğrudan sömürülmesinin zor olduğu ancak tanımsız davranış risklerini açıkça gösterdiği aktarıldı.
Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.