ਤੁਹਾਡੀਆਂ ਭਰੋਸੇਮੰਦ ਲਾਇਬ੍ਰੇਰੀਆਂ ਵਿੱਚ ਲੁਕੇ ਹੋਏ ਉਹੀ ਕੁਝ ਬੱਗ (Bugs)
ਮੈਂ Langchain, Vite, ਅਤੇ Bat ਵਰਗੀਆਂ ਵੱਡੀਆਂ ਰਿਪੋਜ਼ਟਰੀਆਂ (repositories) ਨੂੰ ਛੋਟੇ ਫਿਕਸ ਭੇਜਣ ਵਿੱਚ ਸਮਾਂ ਬਿਤਾਉਂਦਾ ਹਾਂ।
ਇਹ ਪ੍ਰੋਜੈਕਟ ਵੱਖ-ਵੱਖ ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਵੱਖ-ਵੱਖ ਡੋਮੇਨਾਂ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ। ਇਸ ਦੇ ਰੱਖ-ਰਖਾਅ ਕਰਨ ਵਾਲੇ (maintainers) ਮਾਹਰ ਹਨ।
ਹੈਰਾਨੀ ਵਾਲੀ ਗੱਲ ਬੱਗਾਂ ਦੀ ਗਿਣਤੀ ਨਹੀਂ ਹੈ। ਇਹ ਉਹਨਾਂ ਦੇ ਪੈਟਰਨ (patterns) ਹਨ। ਜ਼ਿਆਦਾਤਰ ਬੱਗ ਵੱਖ-ਵੱਖ ਰੂਪਾਂ ਵਿੱਚ ਇੱਕੋ ਜਿਹੇ ਹੁੰਦੇ ਹਨ।
ਇੱਕ ਵਾਰ ਜਦੋਂ ਤੁਸੀਂ ਇਹਨਾਂ ਰੂਪਾਂ ਨੂੰ ਪਛਾਣ ਲੈਂਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਉਹਨਾਂ ਨੂੰ ਪ੍ਰੋਡਕਸ਼ਨ (production) ਤੱਕ ਪਹੁੰਚਣ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਫੜ ਲੈਂਦੇ ਹੋ। ਇੱਥੇ ਪੰਜ ਆਮ ਪੈਟਰਨ ਹਨ ਜੋ ਮੈਨੂੰ ਮਿਲਦੇ ਹਨ:
ਗਲਤ ਇਨਪੁਟ ਕੀਜ਼ (Wrong Input Keys) Langchain ਵਿੱਚ, ਇੱਕ rename ਫੰਕਸ਼ਨ
old_pathਨਾਮ ਦੀ ਕੀ (key) ਲੱਭ ਰਿਹਾ ਸੀ। ਸਿਸਟਮ ਨੇ ਅਸਲ ਵਿੱਚpathਨਾਮ ਦੀ ਕੀ ਭੇਜੀ ਸੀ। ਕੋਡ ਕ੍ਰੈਸ਼ ਹੋ ਗਿਆ। ਰਿਵਿਊ ਵਿੱਚ ਕਿਉਂ ਬਚ ਜਾਂਦਾ ਹੈ: ਯੂਨਿਟ ਟੈਸਟ ਪਾਸ ਹੋ ਗਿਆ ਕਿਉਂਕਿ ਡਿਵੈਲਪਰ ਨੇ ਮੈਨੂਅਲੀ ਉਹ ਇਨਪੁਟ ਤਿਆਰ ਕੀਤਾ ਸੀ ਜੋ ਫੰਕਸ਼ਨ ਨੂੰ ਚਾਹੀਦਾ ਸੀ, ਨਾ ਕਿ ਉਹ ਇਨਪੁਟ ਜੋ ਸਿਸਟਮ ਅਸਲ ਵਿੱਚ ਭੇਜਦਾ ਹੈ। ਚੈੱਕ: ਜੇਕਰ ਕੋਈ ਫੰਕਸ਼ਨ ਕਿਸੇ ਕੀ (key) ਨੂੰ ਪੜ੍ਹਦਾ ਹੈ, ਤਾਂ ਦੇਖੋ ਕਿ ਉਹ ਆਬਜੈਕਟ ਕਿੱਥੇ ਬਣਾਇਆ ਗਿਆ ਹੈ। ਜੇਕਰ ਕੋਈ ਵੀ ਉਸ ਕੀ ਨੂੰ ਸੈੱਟ ਨਹੀਂ ਕਰਦਾ, ਤਾਂ ਤੁਹਾਨੂੰ ਇੱਕ ਬੱਗ ਮਿਲ ਗਿਆ ਹੈ। ਅਸਲ ਕਾਲਰ (caller) ਦੇ ਵਿਰੁੱਧ ਟੈਸਟ ਕਰੋ।ਟਰੂਥੀਨੈੱਸ ਟ੍ਰੈਪਸ (Truthiness Traps) ਇੱਕ ਆਮ ਗਲਤੀ ਉਦੋਂ ਹੁੰਦੀ ਹੈ ਜਦੋਂ ਤੁਸੀਂ "ਕੀ ਇਹ ਮੁੱਲ (value) ਸੈੱਟ ਹੈ" ਕਹਿਣਾ ਚਾਹੁੰਦੇ ਹੋ ਪਰ truthiness ਚੈੱਕ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ। ਉਦਾਹਰਨ:
const clause = defaultValue ? \DEFAULT ${defaultValue}` : '';` ਜੇਕਰ ਮੁੱਲ 0 ਹੈ, ਤਾਂ ਕੋਡ ਉਸ ਬ੍ਰਾਂਚ ਨੂੰ ਛੱਡ ਦਿੰਦਾ ਹੈ। 0 ਇੱਕ ਅਸਲ ਮੁੱਲ ਹੈ, ਪਰ ਇਹ "falsy" ਹੈ। ਚੈੱਕ: ਹਮੇਸ਼ਾ 0, ਖਾਲੀ ਸਟ੍ਰਿੰਗਾਂ (empty strings), ਅਤੇ false ਦਾ ਟੈਸਟ ਕਰੋ। ਜੇਕਰ ਤੁਹਾਡਾ ਕੋਡ "ਗਾਇਬ" ਅਤੇ "ਮੌਜੂਦ ਪਰ ਜ਼ੀਰੋ" ਵਿਚਕਾਰ ਅੰਤਰ ਨਹੀਂ ਕਰ ਸਕਦਾ, ਤਾਂ ਇਹ ਖਰਾਬ ਹੈ।ਅਨਸਾਈਂਡ ਇੰਟੇਜਰ ਅੰਡਰਫਲੋ (Unsigned Integer Underflow) Bat ਪ੍ਰੋਜੈਕਟ ਵਿੱਚ, ਟਰਮੀਨਲ ਦੀ ਚੌੜਾਈ ਦੀ ਗਣਨਾ ਕਰਨ ਲਈ ਗਣਿਤ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਗਈ ਸੀ। ਜੇਕਰ ਚੌੜਾਈ ਬਹੁਤ ਘੱਟ ਸੀ, ਤਾਂ ਘਟਾਓ (subtraction) ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਅੰਡਰਫਲੋ (underflow) ਹੋ ਗਿਆ। Unsigned types 'ਤੇ, ਇਹ ਇੱਕ ਬਹੁਤ ਵੱਡੀ ਸੰਖਿਆ ਵਿੱਚ ਬਦਲ ਜਾਂਦਾ ਹੈ ਜਾਂ ਕ੍ਰੈਸ਼ ਹੋ ਜਾਂਦਾ ਹੈ। ਚੈੱਕ: ਯੂਜ਼ਰ ਇਨਪੁਟ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਕਿਸੇ ਵੀ unsigned type 'ਤੇ ਕੀਤੀ ਗਈ ਘਟਾਓ ਲਈ 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 ਬਲਾਕ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। ਇਹ ਦੇਖਣ ਲਈ ਕਿ ਤੁਹਾਡਾ ਕੋਡ ਟੁੱਟਦਾ ਹੈ ਜਾਂ ਨਹੀਂ, ਇਸ ਵਿੱਚ ਖਰਾਬ ਸਟ੍ਰਿੰਗਾਂ ਪਾ ਕੇ ਦੇਖੋ।
ਮੇਰੀ ਆਦਤ ਸਰਲ ਹੈ। ਜਦੋਂ ਮੈਂ ਇੱਕ ਬੱਗ ਨੂੰ ਠੀਕ ਕਰਦਾ ਹਾਂ, ਤਾਂ ਮੈਂ ਉਸ ਦੇ ਬਿਲਕੁਲ ਨਾਲ ਵਾਲੇ ਕੋਡ ਨੂੰ ਦੇਖਦਾ ਹਾਂ। ਜੇਕਰ ਇੱਕ ਹੈਂਡਲਰ (handler) ਵਿੱਚ ਬੱਗ ਹੈ, ਤਾਂ ਅਕਸਰ ਉਸ ਦੇ ਨਾਲ ਵਾਲੇ ਹੈਂਡਲਰ ਵਿੱਚ ਵੀ ਉਹੀ ਰੂਪ ਹੁੰਦਾ ਹੈ।
ਸਰੋਤ: https://dev.to/greymothjp/the-same-few-bugs-keep-hiding-in-libraries-you-already-trust-1pgp
