आपके भरोसेमंद लाइब्रेरीज में छिपे वही कुछ पुराने बग्स
मैं Langchain, Vite, और Bat जैसे बड़े रिपॉजिटरीज़ को छोटे-छोटे फिक्स भेजने में समय बिताता हूँ।
ये प्रोजेक्ट्स अलग-अलग भाषाओं और अलग-अलग डोमेन का उपयोग करते हैं। इनके मेंटेनर एक्सपर्ट्स हैं।
चौंकाने वाली बात बग्स की संख्या नहीं है। चौंकाने वाली बात उनके पैटर्न हैं। अधिकांश बग्स बस कुछ ही तरह के होते हैं, जो बस अलग-अलग रूप में सामने आते हैं।
एक बार जब आप इन पैटर्न्स को पहचान लेते हैं, तो आप उन्हें प्रोडक्शन तक पहुँचने से पहले ही पकड़ सकते हैं। यहाँ पाँच सामान्य पैटर्न दिए गए हैं जो मुझे मिलते हैं:
गलत इनपुट कीज़ (Wrong Input Keys) Langchain में, एक rename फंक्शन old_path नाम की की को ढूँढ रहा था। सिस्टम ने वास्तव में path नाम की की भेजी थी। कोड क्रैश हो गया। रिव्यू में क्यों बच जाता है: यूनिट टेस्ट पास हो गया क्योंकि डेवलपर ने मैन्युअल रूप से वही इनपुट बनाया था जो फंक्शन को चाहिए था, न कि वह इनपुट जो सिस्टम वास्तव में भेजता है। जाँच: यदि कोई फंक्शन किसी की (key) को पढ़ता है, तो पता लगाएँ कि वह ऑब्जेक्ट कहाँ बनाया गया है। यदि कोई भी उस की को सेट नहीं कर रहा है, तो आपको एक बग मिल गया है। वास्तविक कॉलर (caller) के साथ टेस्ट करें।
ट्रुथिनेस ट्रैप्स (Truthiness Traps) एक आम गलती तब होती है जब आप "क्या यह वैल्यू सेट है" के बजाय ट्रुथिनेस (truthiness) चेक का उपयोग करते हैं। उदाहरण:
const clause = defaultValue ? \DEFAULT ${defaultValue}` : '';` यदि वैल्यू 0 है, तो कोड उस ब्रांच को छोड़ देता है। 0 एक वास्तविक वैल्यू है, लेकिन यह "falsy" है। जाँच: हमेशा 0, खाली स्ट्रिंग्स (empty strings), और false का टेस्ट करें। यदि आपका कोड "गायब" (missing) और "मौजूद लेकिन शून्य" (present but zero) के बीच अंतर नहीं कर सकता, तो वह खराब है।अनसाइंड इंटीजर अंडरफ्लो (Unsigned Integer Underflow) Bat प्रोजेक्ट में, टर्मिनल की चौड़ाई (width) की गणना करने के लिए गणित का उपयोग किया गया था। यदि चौड़ाई बहुत कम थी, तो घटाव (subtraction) के परिणामस्वरूप अंडरफ्लो (underflow) हो गया। अनसाइंड टाइप्स (unsigned types) पर, यह एक बहुत बड़ी संख्या में बदल जाता है या क्रैश हो जाता है। जाँच: यूजर इनपुट का उपयोग करने वाले किसी भी अनसाइंड टाइप पर घटाव के लिए सैचुरेटिंग सबट्रैक्शन (saturating subtraction) की आवश्यकता होती है। 0 और 1 के साथ टेस्ट करें।
एनकोडिंग और एज केसेस (Encoding and Edge Cases) टेक्स्ट के नियम तब तक सरल लगते हैं जब तक आप non-ASCII कैरेक्टर्स नहीं देखते। Mistune में स्टैक्ड डेलीमिटर्स (stacked delimiters) के साथ समस्याएँ थीं जो एक जनरेटर बना सकता है। Wenmode Unicode कॉम्बाइनिंग मार्क्स (combining marks) को हैंडल करते समय फेल हो गया। रिव्यू में क्यों बच जाता है: ASCII हर टेस्ट में पास हो जाता है। बग्स केवल उस इनपुट के साथ दिखाई देते हैं जिसे आप खुद टाइप नहीं करते हैं। जाँच: डिफरेंशियल टेस्ट (differential test) का उपयोग करें। अपने आउटपुट की तुलना किसी अन्य, प्रमाणित इम्प्लीमेंटेशन (implementation) से करें।
अनसेफ पार्सिंग (Unsafe Parsing) Vite में एक मिडलवेयर (middleware) था जो बिना किसी सुरक्षा (guard) के URL को डिकोड करता था। एक गलत तरीके से बना (malformed) URL URIError थ्रो कर देता था और मिडलवेयर को क्रैश कर देता था। जाँच: आप जो कुछ भी डिकोड या पार्स करते हैं जिसे आपने खुद नहीं बनाया है, उसके लिए try/catch ब्लॉक की आवश्यकता होती है। अपने कोड में खराब स्ट्रिंग्स डालकर देखें कि क्या वह झेल पाता है या टूट जाता है।
मेरी आदत सरल है। जब मैं किसी बग को ठीक करता हूँ, तो मैं उसके ठीक बगल वाले कोड को देखता हूँ। यदि एक हैंडलर में बग है, तो अक्सर उसके बगल वाले (sibling) हैंडलर में भी वही पैटर्न होता है।
स्रोत: https://dev.to/greymothjp/the-same-few-bugs-keep-hiding-in-libraries-you-already-trust-1pgp
