1 puan yazan GN⁺ 2025-04-24 | 1 yorum | WhatsApp'ta paylaş
  • GTA San Andreas'taki 20 yıllık hata Windows 11 24H2'de ortaya çıktı
    • GTA San Andreas'ta Skimmer uçağının Windows 11 24H2'de kaybolduğu bir hata bildirildi
    • SilentPatch kullanılsa da sorun çözülmüyor
    • Windows 11 23H2'de sorun ortaya çıkmıyor
    • Windows 11 24H2'ye güncelleyen kullanıcıların tamamı bu hatayı yaşıyor

Hata incelemesi

Sorun neydi?

  • SilentPatch kurulduğunda oyunun takılması sorunu yaşanıyor
  • CPlane::PreRender içinde küçük bir döngüye takılı kaldığı tespit edildi
  • Uçağın pervane hızı anormal derecede yüksek ayarlanıyor
  • Pervane hızı, uçağın irtifasıyla orantılı olarak hesaplanıyor

Neden ve nasıl?

  • Skimmer'ın vehicles.ide tanımında gerekli parametre eksik
  • Vice City'de Skimmer bir tekne olarak tanımlanmıştı
  • San Andreas'ta uçağa dönüştürüldü ancak gerekli parametre eklenmedi

Asıl kök neden

  • Sorun, Windows 11 24H2'de yığının kullanılma biçiminin değişmesiyle ortaya çıkıyor
  • LeaveCriticalSection artık yığında daha fazla alan kullanıyor
  • Önceden fgets ve LeaveCriticalSection yığın alanının üstüne yazmıyordu, artık yazıyor

Bu sorun neden ancak şimdi ortaya çıktı?

  • Windows 11 24H2'deki değişiklikler nedeniyle yığın alanı değişti
  • Oyun, başlatılmamış yerel değişken kullandığı için bu sorun oluştu
  • Sorun diğer platformlarda zaten düzeltilmişti

Bu sorunu oyunda çözmek isterseniz?

  • Bir sonraki SilentPatch hotfix'ine kod düzeltmesi eklenecek
  • vehicles.ide dosyasını elle düzenleyerek sorun çözülebilir

Son söz

  • Bu hatanın belirli bir OS sürümüyle doğrudan bağlantılı olması ilgi çekici
  • Yığın yerleşimindeki değişikliklerin uyumluluğu etkileyebileceğini gösteriyor
  • Girdi verileri doğrulanmalı ve derleyici uyarıları göz ardı edilmemeli

1 yorum

 
GN⁺ 2025-04-24
Hacker News yorumları
  • Raymond Chen’in ilgisini çekmesini bekleyebileceğiniz türden bir şey. Bu çok büyük bir övgü
  • Sorunun kök nedeninin daha derine kadar izlenmiş olmasına sevindim
  • Benim kişisel görüşüme göre, sözleşmenin parçası olmayan şeyler rastgeleleştirilmeli. Örneğin bir dilde map’in yineleme sırası garanti edilmiyorsa, dil bunu rastgele yapmalı. Aksi halde kod kırılganlaşıyor
  • Derleyici uyarılarını göz ardı etmemek gerekir. Bu kod muhtemelen orijinal kodda uyarı üretirdi
  • Burada beklenebilecek derleyici hatası ne olurdu? Muhtemelen scanf dönüş değerinin kontrol edilmemesi ve böylece parametre sayısıyla eşleştiğinin doğrulanmaması olabilir. Bunun dışında bu, derleyicinin bilemeyeceği bir veri dosyası hatası gibi görünüyor
  • Teknik yazılar okumaktan her zaman keyif alırım. Yapay zeka çağında bunların ne kadar daha nadir hale geleceğini merak ediyorum
  • Windows’un critical section kilitleme/kilit açma uygulamasında neyin değiştiğini merak ediyorum
  • Erişim sorunu yaşayanlar için bağlantı bırakıyorum
  • Stack sınırının ötesini okuyup yazmak her zaman fazla kolaydı. Bunun doğrudan başarısız olması gerekir
  • Azaltım önlemleri var — ASLR, NX sayfaları, stack smashing koruması vb. Ama bunlar stack’in ötesindeki eski verilerin okunmasını tamamen engelleyemiyor
  • Donanımın stack alanının kullanılmayan bölümünü okumayı veya yazmayı engellemesi nasıl olurdu diye bir düşünce deneyi
  • Stack’in başlangıç adresi A, boyutu S ve mevcut derinliği D’yi izlemeye yönelik öneri
    • CPU’ya stack’in A adresinde, S boyutunda bulunduğunu bildiren bir komut eklemek
    • Stack’te N bayt ayıran bir jump komutu eklemek
    • Mevcut return komutuna stack farkındalığı eklemek
    • Mevcut derinliğin ötesindeki stack alanına okuma veya yazmanın başarısız olması
    • Stack’in aşağı doğru büyüdüğü mimarilerde aritmetik ters yönde uygulanır
  • Dezavantajı, tek bir çağrı kuralını sabitlemesi ve CPU bellek yöneticisinin çok fazla durum bilgisine ihtiyaç duyması
  • Stack her yerde var. Donanım düzeyinde stack farkındalığı yeni azaltım önlemlerinin önünü açar
  • Bu fikir neden yaygın değil? Hiç denendi mi?
  • Tüm bu bulgular, bunun Windows 11 24H2’deki bir sorun olmadığını kanıtlıyor. Oyun tanımsız davranışa dayanıyor
  • Tanımsız davranış çok sinsidir; zaten hata yapmış olsanız bile size doğru olduğunuzu düşündürür
  • Bir C veya C++ programı tanımsız davranış tetiklerse, programın çalışması sırasında her şey olabilir
  • Şanslıysanız program uygun bir hata mesajı gösterir ya da çöker ve böylece bir sorun olduğunu hemen anlarsınız
  • Şansınız kötüyse program verileri sessizce bozar ve siz sorunu fark ettiğinizde sebep geçmişteki çalıştırma kayıtlarına gömülmüş olur
  • Çok daha şanssızsanız program istediğiniz gibi çalışır; sonra alakasız bir kodu, derleyici sürümünü ya da işletim sistemini değiştirirsiniz ve yeni bir hata ortaya çıkar
  • Geliştiriciler için daha iyi yöntemler bulmaya yönelik öneriler
    • C veya C++’ta tanımsız davranışı okuyun, anlayın ve ezberleyin; sonra da bundan kaçının
    • Uygulamayı debug modunda derleyin ve release moduyla karşılaştırın; fark varsa ciddi bir sorun vardır
    • Çalışma zamanında tanımsız davranışı yakalamak için -fsanitize=undefined,address gibi araçlar kullanın
    • Java, C#, Python gibi yönetilen dilleri kullanmanız önerilir. Ya da Rust gibi güvenli düşük seviyeli bir dil kullanın
  • Debugger kullanmanız önerilir. Debugger kullanmamanın sorunlarına dair hikâyeler duydum
  • Silent’a çok sevgiler. 10 yılı aşkın süredir sevdiğim oyunları daha iyi hale getiriyor