1 poin oleh GN⁺ 2025-04-24 | 1 komentar | Bagikan ke WhatsApp
  • Bug GTA San Andreas yang sudah berusia 20 tahun muncul di Windows 11 24H2
    • Dilaporkan ada bug di GTA San Andreas yang membuat pesawat Skimmer menghilang di Windows 11 24H2
    • Masalah ini tidak teratasi meskipun menggunakan SilentPatch
    • Masalah tidak terjadi di Windows 11 23H2
    • Semua pengguna yang memperbarui ke Windows 11 24H2 mengalami bug ini

Investigasi bug

Apa yang salah?

  • Saat SilentPatch dipasang, game mengalami hang
  • Ditemukan bahwa game terjebak dalam loop kecil di CPlane::PreRender
  • Kecepatan baling-baling pesawat disetel sangat tinggi secara tidak normal
  • Kecepatan baling-baling dihitung secara proporsional terhadap ketinggian pesawat

Mengapa dan bagaimana?

  • Parameter yang diperlukan hilang dari definisi vehicles.ide milik Skimmer
  • Di Vice City, Skimmer didefinisikan sebagai perahu
  • Di San Andreas, Skimmer diubah menjadi pesawat, tetapi parameter yang diperlukan tidak ditambahkan

Akar penyebab yang sebenarnya

  • Masalah terjadi karena cara penggunaan stack berubah di Windows 11 24H2
  • LeaveCriticalSection menjadi menggunakan lebih banyak ruang stack
  • Sebelumnya fgets dan LeaveCriticalSection tidak menimpa ruang stack, tetapi sekarang menimpanya

Mengapa masalah ini baru muncul sekarang?

  • Perubahan di Windows 11 24H2 menyebabkan ruang stack berubah
  • Masalah terjadi karena game menggunakan variabel lokal yang belum diinisialisasi
  • Di platform lain, masalah ini sebenarnya sudah diperbaiki

Jika ingin memperbaiki masalah ini di dalam game?

  • Perbaikan kode akan disertakan dalam hotfix SilentPatch berikutnya
  • Masalah juga bisa diatasi dengan mengedit file vehicles.ide secara manual

Kata penutup

  • Bug ini menarik karena terhubung langsung dengan rilis OS tertentu
  • Ini menunjukkan bahwa perubahan tata letak stack dapat memengaruhi kompatibilitas
  • Data input harus divalidasi dan peringatan compiler tidak boleh diabaikan

1 komentar

 
GN⁺ 2025-04-24
Komentar Hacker News
  • Ini terdengar seperti sesuatu yang layak dinantikan dari Raymond Chen. Itu pujian yang sangat tinggi
  • Senang melihat penyebab masalahnya ditelusuri lebih dalam
  • Menurut pendapat pribadi saya, hal-hal yang bukan bagian dari kontrak seharusnya diacak. Misalnya, jika bahasa tidak menjamin urutan iterasi map, maka bahasa itu seharusnya mengacaknya. Kalau tidak, kode jadi rapuh
  • Peringatan kompilasi tidak boleh diabaikan. Kemungkinan besar kode ini memunculkan peringatan dalam kode aslinya
  • Kira-kira kesalahan kompilator apa yang bisa diharapkan di sini? Mungkin karena nilai kembalian scanf tidak diperiksa untuk memastikan cocok dengan jumlah parameter. Selain itu, ini tampak seperti kesalahan file data yang tidak bisa diketahui kompilator
  • Saya selalu menikmati membaca tulisan teknis. Saya penasaran seberapa jauh tulisan seperti ini akan menjadi makin langka di era AI
  • Saya penasaran apa yang berubah dalam implementasi lock/unlock critical section di Windows
  • Menyediakan tautan bagi orang-orang yang mengalami masalah akses
  • Membaca dan menulis melewati stack selalu terlalu mudah. Seharusnya ini gagal begitu saja
  • Memang ada langkah mitigasi - ASLR, halaman NX, perlindungan stack smashing, dan sebagainya. Namun itu tidak sepenuhnya mencegah pembacaan data lama di luar stack
  • Eksperimen pikiran tentang bagaimana jika hardware tidak mengizinkan membaca atau menulis bagian stack yang tidak digunakan
  • Usulan cara melacak alamat awal stack A, ukuran S, dan kedalaman saat ini D
    • Tambahkan instruksi untuk memberi tahu CPU bahwa stack berada di alamat A dengan ukuran S
    • Tambahkan instruksi lompatan yang mencadangkan N byte di stack
    • Tambahkan kesadaran stack ke instruksi return yang sudah ada
    • Pembacaan atau penulisan ke area stack di luar kedalaman saat ini harus gagal
    • Pada arsitektur dengan stack yang tumbuh ke bawah, aritmetikanya berlaku sebaliknya
  • Kekurangannya adalah ini mematok satu calling convention, dan pengelola memori CPU memerlukan banyak state
  • Stack ada di mana-mana. Kesadaran stack di hardware akan membuka langkah mitigasi baru
  • Mengapa ide ini tidak umum? Apakah ini pernah dicoba?
  • Semua temuan ini membuktikan bahwa ini bukan masalah Windows 11 24H2. Game tersebut bergantung pada undefined behavior
  • Undefined behavior sangat licik, karena membuat Anda percaya bahwa Anda benar padahal sebenarnya sudah melakukan kesalahan
  • Jika program C atau C++ memicu undefined behavior, apa pun bisa terjadi selama eksekusi program
  • Jika beruntung, program akan menampilkan pesan kesalahan yang layak atau crash sehingga Anda langsung tahu ada masalah
  • Jika tidak beruntung, program akan diam-diam merusak data, dan saat Anda menyadari masalahnya, penyebabnya sudah terkubur dalam riwayat eksekusi masa lalu
  • Jika sangat tidak beruntung, program akan bekerja seperti yang diinginkan, lalu ketika Anda mengubah kode yang tidak terkait, atau mengganti versi kompilator, sistem operasi, dan sebagainya, bug baru pun muncul
  • Saran untuk menemukan cara yang lebih baik sebagai developer
    • Baca, pahami, dan hafalkan undefined behavior di C atau C++, lalu hindari itu
    • Kompilasikan aplikasi dalam mode debug dan bandingkan dengan mode rilis; jika ada perbedaan, ada masalah serius
    • Gunakan alat seperti -fsanitize=undefined,address untuk menangkap undefined behavior saat runtime
    • Disarankan memakai bahasa terkelola seperti Java, C#, Python. Atau gunakan bahasa low-level yang aman seperti Rust
  • Disarankan menggunakan debugger. Saya pernah mendengar kisah tentang masalah akibat tidak menggunakan debugger
  • Banyak cinta untuk Silent. Dia telah meningkatkan game favorit saya selama lebih dari 10 tahun