நீங்கள் நம்பும் நூலகங்களில் (Libraries) ஒளிந்திருக்கும் அதே சில பிழைகள்
Langchain, Vite மற்றும் Bat போன்ற பெரிய களஞ்சியங்களுக்கு (repositories) சிறிய திருத்தங்களை (fixes) அனுப்புவதில் நான் நேரத்தைச் செலவிடுகிறேன்.
இந்தத் திட்டங்கள் வெவ்வேறு மொழிகளையும் வெவ்வேறு துறைகளையும் பயன்படுத்துகின்றன. இவற்றை நிர்வகிப்பவர்கள் (maintainers) நிபுணர்கள்.
ஆச்சரியமான விஷயம் பிழைகளின் எண்ணிக்கை அல்ல; மாறாக அவற்றின் வடிவங்கள் (patterns) தான். பெரும்பாலான பிழைகள் வெவ்வேறு உடைகளை அணிந்திருக்கும் அதே சில வடிவங்களையே கொண்டிருக்கின்றன.
இந்த வடிவங்களை நீங்கள் அடையாளம் கண்டுவிட்டால், அவை பயன்பாட்டுக்கு (production) வரும் முன்பே அவற்றைப் பிடித்துவிடலாம். நான் கண்டறிந்த ஐந்து பொதுவான வடிவங்கள் இதோ:
தவறான உள்ளீட்டு விசைகள் (Wrong Input Keys) Langchain-இல், ஒரு rename function
old_pathஎன்ற விசையைத் தேடியது. ஆனால் சிஸ்டம் உண்மையில்pathஎன்ற விசையை அனுப்பியது. இதனால் குறியீடு (code) செயலிழந்தது. ஏன் இது ஆய்வில் (review) சிக்காமல் தப்பியது: டெவலப்பர் அந்த function எதை எதிர்பார்க்கிறதோ அதைத் தான் கைமுறையாக (manually) உருவாக்கி unit test செய்ததால், சிஸ்டம் உண்மையில் அனுப்பும் உள்ளீட்டை அது சோதிக்கவில்லை. சரிபார்க்கும் முறை: ஒரு function ஒரு விசையை (key) வாசித்தால், அந்த object எங்கு உருவாக்கப்படுகிறது என்பதைக் கண்டறியவும். அந்த விசை எங்கும் அமைக்கப்படவில்லை என்றால், நீங்கள் ஒரு பிழையைக் கண்டறிந்துவிட்டீர்கள். உண்மையான அழைப்பாளர் (real caller) மூலம் சோதிக்கவும்.Truthiness பொறிகள் (Truthiness Traps) "இந்த மதிப்பு அமைக்கப்பட்டுள்ளதா?" என்று சரிபார்க்க வேண்டிய இடத்தில், truthiness சோதனையைப் பயன்படுத்துவது ஒரு பொதுவான தவறு. உதாரணம்:
const clause = defaultValue ? \DEFAULT ${defaultValue}` : '';` மதிப்பு 0 ஆக இருந்தால், குறியீடு அந்தப் பகுதியைத் தவிர்க்கும். 0 என்பது ஒரு உண்மையான மதிப்பு, ஆனால் அது "falsy" ஆகும். சரிபார்க்கும் முறை: எப்போதும் 0, காலியான சரங்கள் (empty strings) மற்றும் false ஆகியவற்றைச் சோதிக்கவும். உங்கள் குறியீட்டினால் "விடுபட்டது" (missing) மற்றும் "இருக்க ngunit பூஜ்ஜியம்" (present but zero) ஆகியவற்றுக்கு இடையிலான வித்தியாசத்தைக் கண்டறிய முடியாவிட்டால், அது தவறானது.Unsigned Integer Underflow Bat திட்டத்தில், terminal அகலத்தைக் கணக்கிட கணித முறை பயன்படுத்தப்பட்டது. அகலம் மிகக் குறைவாக இருந்தால், கழித்தல் செயல்பாடு underflow-க்கு வழிவகுத்தது. Unsigned வகைகளில், இது ஒரு மிகப்பெரிய எண்ணாக மாறிவிடும் அல்லது செயலிழக்கும். சரிபார்க்கும் முறை: பயனர் உள்ளீட்டைப் பயன்படுத்தி ஒரு unsigned வகையில் செய்யப்படும் எந்தவொரு கழித்தலுக்கும் saturating subtraction தேவை. 0 மற்றும் 1 கொண்டு சோதிக்கவும்.
Encoding மற்றும் விளிம்பு நிலைச் சூழல்கள் (Edge Cases) non-ASCII எழுத்துக்களைப் பார்க்கும் வரை உரை விதிகள் (text rules) எளிமையாகத் தோன்றும். Mistune-இல், ஒரு generator உருவாக்கக்கூடிய அடுக்குநிலை பிரிக்கிகளால் (stacked delimiters) சிக்கல்கள் இருந்தன. Wenmode-இல் Unicode combining marks-களைக் கையாளும்போது தோல்வி ஏற்பட்டது. ஏன் இது ஆய்வில் சிக்காமல் தப்பியது: ASCII அனைத்துச் சோதனைகளிலும் தேர்ச்சி பெற்றுவிடும். நீங்கள் கைமுறையாகத் தட்டச்சு செய்யாத உள்ளீடுகளின் போது மட்டுமே பிழைகள் தோன்றும். சரிபார்க்கும் முறை: ஒரு differential test-ஐப் பயன்படுத்தவும். உங்கள் வெளியீட்டை (output) வேறொரு நிரூபிக்கப்பட்ட செயலாக்கத்துடன் (implementation) ஒப்பிட்டுப் பார்க்கவும்.
பாதுகாப்பற்ற Parsing (Unsafe Parsing) Vite-இல் ஒரு middleware இருந்தது, அது எந்தப் பாதுகாப்பும் இன்றி URL-களை decode செய்தது. தவறான வடிவம் கொண்ட (malformed) URL ஒரு URIError-ஐ உருவாக்கி middleware-ஐச் செயலிழக்கச் செய்தது. சரிபார்க்கும் முறை: நீங்கள் உருவாக்காத எதையும் decode அல்லது parse செய்யும்போது அதற்கு ஒரு try/catch block தேவை. உங்கள் குறியீடு தாங்குமா அல்லது உடைந்துவிடுமா என்பதை அறிய, அதில் தவறான சரங்களை (broken strings) உள்ளீடாகக் கொடுத்துப் பார்க்கவும்.
எனது பழக்கம் எளிமையானது. நான் ஒரு பிழையைச் சரிசெய்யும்போது, அதற்கு அருகிலுள்ள குறியீட்டையும் பார்க்கிறேன். ஒரு handler-இல் பிழை இருந்தால், அதன் பக்கத்து handler-இலும் பெரும்பாலும் அதே போன்ற பிழை இருக்கும்.
ஆதாரம்: https://dev.to/greymothjp/the-same-few-bugs-keep-hiding-in-libraries-you-already-trust-1pgp
