1 पॉइंट द्वारा GN⁺ 2025-04-24 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • GTA San Andreas का 20 साल पुराना bug Windows 11 24H2 में सामने आया
    • GTA San Andreas में Skimmer विमान के Windows 11 24H2 पर गायब होने का bug रिपोर्ट हुआ
    • SilentPatch इस्तेमाल करने पर भी समस्या हल नहीं होती
    • Windows 11 23H2 में यह समस्या नहीं होती
    • Windows 11 24H2 में अपडेट करने वाले सभी users ने यह bug अनुभव किया

bug की जाँच

क्या गलत हुआ?

  • SilentPatch इंस्टॉल करने पर game फ्रीज़ होने की समस्या होती है
  • CPlane::PreRender में एक छोटे loop में फँसने की स्थिति मिली
  • विमान की blade speed असामान्य रूप से बहुत अधिक सेट हो रही थी
  • blade speed की गणना विमान की ऊँचाई के अनुपात में होती है

क्यों और कैसे?

  • Skimmer की vehicles.ide definition में ज़रूरी parameter गायब है
  • Vice City में Skimmer को boat के रूप में define किया गया था
  • San Andreas में इसे plane में बदल दिया गया, लेकिन ज़रूरी parameter नहीं जोड़ा गया

असली root cause

  • Windows 11 24H2 में stack उपयोग का तरीका बदलने से यह समस्या हुई
  • LeaveCriticalSection अब stack space ज़्यादा इस्तेमाल करता है
  • पहले fgets और LeaveCriticalSection stack space को overwrite नहीं करते थे, लेकिन अब करते हैं

यह समस्या अब तक क्यों नहीं आई?

  • Windows 11 24H2 के बदलावों की वजह से stack space बदल गया
  • game ने uninitialized local variable का उपयोग किया, जिससे यह समस्या हुई
  • अन्य platforms पर यह समस्या पहले ही ठीक की जा चुकी थी

अगर आप game में यह समस्या ठीक करना चाहते हैं?

  • अगली SilentPatch hotfix में code fix शामिल होगा
  • vehicles.ide फ़ाइल को manually edit करके भी समस्या हल की जा सकती है

अंतिम बात

  • यह bug दिलचस्प है क्योंकि यह सीधे एक खास OS release से जुड़ा है
  • यह दिखाता है कि stack layout में बदलाव compatibility को प्रभावित कर सकते हैं
  • input data को validate करना चाहिए और compiler warnings को नज़रअंदाज़ नहीं करना चाहिए

1 टिप्पणियां

 
GN⁺ 2025-04-24
Hacker News की राय
  • Raymond Chen के काम जैसी चीज़ लगती है. यह बहुत बड़ी तारीफ़ है
  • यह देखकर खुशी हुई कि उन्होंने समस्या के कारण को और गहराई से ट्रेस किया
  • मेरी निजी राय में, जो चीज़ें contract का हिस्सा नहीं हैं उन्हें random होना चाहिए. उदाहरण के लिए, अगर किसी language में map की iteration order की गारंटी नहीं है, तो language को उसे random बनाना चाहिए. नहीं तो code नाज़ुक हो जाता है
  • compiler warnings को नज़रअंदाज़ नहीं करना चाहिए. संभव है कि इस code ने original code में warning दी हो
  • यहाँ किस compiler error की उम्मीद की जा सकती है? शायद यह कि scanf की return value चेक नहीं की गई, ताकि यह पुष्टि हो सके कि वह parameters की संख्या से मेल खाती है. वरना यह compiler को ऐसी data file error जैसी चीज़ लगेगी जिसे वह जान ही नहीं सकता
  • मुझे technical लेख पढ़ना हमेशा पसंद है. सोचता हूँ AI के दौर में ऐसे लेख कितने और दुर्लभ हो जाएँगे
  • जिज्ञासा है कि Windows में critical section lock/unlock implementation में क्या बदला गया
  • जिन लोगों को access की समस्या है, उनके लिए लिंक दिया गया है
  • stack के बाहर पढ़ना और लिखना हमेशा बहुत आसान रहा है. इसे बस fail हो जाना चाहिए
  • mitigation मौजूद हैं - ASLR, NX pages, stack smashing protection आदि. लेकिन ये stack के बाहर मौजूद पुराने data को पढ़ने से पूरी तरह नहीं रोकते
  • यह एक thought experiment है कि अगर hardware stack area के unused हिस्सों को पढ़ने या लिखने की अनुमति ही न दे तो क्या हो
  • stack का starting address A, size S, और current depth D ट्रैक करने का एक तरीका सुझाया गया
    • CPU को यह बताने के लिए instruction जोड़ा जाए कि stack address A पर size S के साथ मौजूद है
    • stack पर N bytes reserve करने के लिए jump instruction जोड़ा जाए
    • मौजूदा return instruction में stack awareness जोड़ी जाए
    • current depth से बाहर के stack area पर read या write fail हो
    • जिन architectures में stack नीचे की ओर बढ़ता है, वहाँ arithmetic उलटी तरह से लागू होगी
  • कमी यह है कि इससे एक calling convention तय हो जाएगी, और CPU memory manager को बहुत state संभालनी पड़ेगी
  • stack हर जगह है. hardware-level stack awareness नई mitigations के रास्ते खोल सकती है
  • यह विचार आम क्यों नहीं है? क्या इसे कभी आज़माया गया है?
  • यह पूरी खोज साबित करती है कि यह Windows 11 24H2 की समस्या नहीं है. game undefined behavior पर निर्भर कर रहा है
  • undefined behavior बहुत चालाक चीज़ है, क्योंकि गलती कर लेने के बाद भी यह आपको यक़ीन दिला सकती है कि आप सही हैं
  • अगर कोई C या C++ program undefined behavior trigger करता है, तो program execution में कुछ भी हो सकता है
  • अगर आप lucky हैं, तो program ठीक-ठाक error message दिखाएगा या crash करेगा, जिससे तुरंत पता चल जाएगा कि समस्या है
  • अगर आप unlucky हैं, तो program चुपचाप data खराब कर देगा, और जब तक आप समस्या पहचानेंगे, उसका कारण पुराने execution history में दब चुका होगा
  • अगर आप बहुत ही unlucky हैं, तो program आपकी इच्छा के मुताबिक चलता रहेगा, और फिर जैसे ही आप कोई असंबंधित code, compiler version, operating system वगैरह बदलेंगे, एक नया bug सामने आ जाएगा
  • developer के रूप में बेहतर तरीका खोजने के लिए सुझाव
    • C या C++ में undefined behavior के बारे में पढ़ें, समझें, याद रखें, और उससे बचें
    • application को debug mode में compile करें और release mode से तुलना करें; अगर अंतर है, तो गंभीर समस्या है
    • runtime पर undefined behavior पकड़ने के लिए -fsanitize=undefined,address जैसे tools का उपयोग करें
    • Java, C#, Python जैसी managed languages के उपयोग की सिफारिश की जाती है. या Rust जैसी safe low-level language का उपयोग करें
  • debugger इस्तेमाल करने की सलाह. debugger का उपयोग न करने की समस्या पर एक कहानी सुनी
  • Silent को ढेर सारा प्यार. उसने 10 साल से भी ज़्यादा समय तक मेरे पसंदीदा game को बेहतर बनाया है