ನಿಮ್ಮ ನಂಬಿಕಸ್ತ ಲೈಬ್ರರಿಗಳಲ್ಲಿ ಅಡಗಿರುವ ಅದೇ ಕೆಲವು ದೋಷಗಳು
ನಾನು Langchain, Vite, ಮತ್ತು Bat ನಂತಹ ದೊಡ್ಡ ರೆಪೊಸಿಟರಿಗಳಿಗೆ ಸಣ್ಣ ಸಣ್ಣ ತಿದ್ದುಪಡಿಗಳನ್ನು (fixes) ಕಳುಹಿಸಲು ಸಮಯ ವ್ಯಯಿಸುತ್ತೇನೆ.
ಈ ಯೋಜನೆಗಳು ವಿಭಿನ್ನ ಭಾಷೆಗಳು ಮತ್ತು ವಿಭಿನ್ನ ಡೊಮೇನ್ಗಳನ್ನು ಬಳಸುತ್ತವೆ. ಇವುಗಳ ನಿರ್ವಾಹಕರು (maintainers) ಪರಿಣಿತರು.
ಆಶ್ಚರ್ಯಕರ ವಿಷಯವೆಂದರೆ ದೋಷಗಳ ಸಂಖ್ಯೆಯಲ್ಲ. ಅದು ಅವುಗಳ ಮಾದರಿಗಳು (patterns). ಹೆಚ್ಚಿನ ದೋಷಗಳು ವಿಭಿನ್ನ ರೂಪದಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುವ ಅದೇ ಕೆಲವು ಮಾದರಿಗಳಾಗಿವೆ.
ಒಮ್ಮೆ ನೀವು ಈ ಮಾದರಿಗಳನ್ನು ಗುರುತಿಸಿದರೆ, ಅವು ಪ್ರೊಡಕ್ಷನ್ಗೆ ತಲುಪುವ ಮೊದಲೇ ನೀವು ಅವುಗಳನ್ನು ಹಿಡಿಯಬಹುದು. ನಾನು ಕಂಡುಕೊಂಡ ಐದು ಸಾಮಾನ್ಯ ಮಾದರಿಗಳು ಇಲ್ಲಿವೆ:
ತಪ್ಪಾದ ಇನ್ಪುಟ್ ಕೀಗಳು (Wrong Input Keys) Langchain ನಲ್ಲಿ, ಒಂದು rename ಫಂಕ್ಷನ್
old_pathಎಂಬ ಕೀಯನ್ನು ಹುಡುಕುತ್ತಿತ್ತು. ಆದರೆ ಸಿಸ್ಟಮ್ ವಾಸ್ತವವಾಗಿpathಎಂಬ ಕೀಯನ್ನು ಕಳುಹಿಸುತ್ತಿತ್ತು. ಇದರಿಂದ ಕೋಡ್ ಕ್ರ್ಯಾಶ್ ಆಗುತ್ತಿತ್ತು. ರಿವ್ಯೂನಲ್ಲಿ ಇದು ಏಕೆ ತಪ್ಪಿಹೋಗುತ್ತದೆ: ಯೂನಿಟ್ ಟೆಸ್ಟ್ ಪಾಸಾಯಿತು ಏಕೆಂದರೆ ಡೆವಲಪರ್ ಸಿಸ್ಟಮ್ ವಾಸ್ತವವಾಗಿ ಕಳುಹಿಸುವ ಇನ್ಪುಟ್ ಬದಲಿಗೆ, ಫಂಕ್ಷನ್ಗೆ ಬೇಕಾದ ಇನ್ಪುಟ್ ಅನ್ನು ಮ್ಯಾನುಯಲ್ ಆಗಿ ಸಿದ್ಧಪಡಿಸಿದ್ದರು. ಪರಿಶೀಲನೆ: ಒಂದು ಫಂಕ್ಷನ್ ಕೀಯನ್ನು ಓದುತ್ತಿದ್ದರೆ, ಆ ಆಬ್ಜೆಕ್ಟ್ ಎಲ್ಲಿ ನಿರ್ಮಿತವಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ಹುಡುಕಿ. ಯಾವುದೂ ಆ ಕೀಯನ್ನು ಸೆಟ್ ಮಾಡದಿದ್ದರೆ, ನೀವು ದೋಷವನ್ನು ಕಂಡುಕೊಂಡಿದ್ದೀರಿ ಎಂದರ್ಥ. ನೈಜ ಕರೆ ಮಾಡುವವರ (real caller) ಮೂಲಕ ಪರೀಕ್ಷಿಸಿ.ಟ್ರೂಥಿನೆಸ್ ಟ್ರ್ಯಾಪ್ಸ್ (Truthiness Traps) "ಈ ಮೌಲ್ಯವನ್ನು ಸೆಟ್ ಮಾಡಲಾಗಿದೆಯೇ" ಎಂದು ತಿಳಿಯಲು ಬಯಸಿದಾಗ, ಟ್ರೂಥಿನೆಸ್ ಚೆಕ್ ಬಳಸುವುದು ಒಂದು ಸಾಮಾನ್ಯ ತಪ್ಪು. ಉದಾಹರಣೆ:
const clause = defaultValue ? \DEFAULT ${defaultValue}` : '';` ಮೌಲ್ಯವು 0 ಆಗಿದ್ದರೆ, ಕೋಡ್ ಆ ಬ್ರಾಂಚ್ ಅನ್ನು ಬಿಟ್ಟುಬಿಡುತ್ತದೆ. 0 ಎಂಬುದು ಒಂದು ನೈಜ ಮೌಲ್ಯವಾಗಿದೆ, ಆದರೆ ಅದು "falsy" ಆಗಿದೆ. ಪರಿಶೀಲನೆ: ಯಾವಾಗಲೂ 0, ಖಾಲಿ ಸ್ಟ್ರಿಂಗ್ಗಳು (empty strings) ಮತ್ತು false ಅನ್ನು ಪರೀಕ್ಷಿಸಿ. ನಿಮ್ಮ ಕೋಡ್ "ಕಾಣೆಯಾಗಿದೆ" ಮತ್ತು "ಇದೆ ಆದರೆ ಸೊನ್ನೆ ಇದೆ" ಎಂಬ ನಡುವಿನ ವ್ಯತ್ಯಾಸವನ್ನು ಗುರುತಿಸಲು ಸಾಧ್ಯವಾಗದಿದ್ದರೆ, ಅದು ದೋಷಪೂರಿತವಾಗಿದೆ.ಅನ್ಸೈನ್ಡ್ ಇಂಟೆಜರ್ ಅಂಡರ್ಫ್ಲೋ (Unsigned Integer Underflow) Bat ಪ್ರಾಜೆಕ್ಟ್ನಲ್ಲಿ, ಟರ್ಮಿನಲ್ ಅಗಲವನ್ನು (terminal width) ಲೆಕ್ಕಹಾಕಲು ಗಣಿತವನ್ನು ಬಳಸಲಾಗುತ್ತಿತ್ತು. ಅಗಲವು ತುಂಬಾ ಚಿಕ್ಕದಾಗಿದ್ದರೆ, ಕಳೆಯುವಿಕೆಯು ಅಂಡರ್ಫ್ಲೋಗೆ ಕಾರಣವಾಗುತ್ತಿತ್ತು. ಅನ್ಸೈನ್ಡ್ ಟೈಪ್ಗಳಲ್ಲಿ, ಇದು ಬೃಹತ್ ಸಂಖ್ಯೆಗೆ ಬದಲಾಗುತ್ತದೆ ಅಥವಾ ಕ್ರ್ಯಾಶ್ ಆಗುತ್ತದೆ. ಪರಿಶೀಲನೆ: ಬಳಕೆದಾರರ ಇನ್ಪುಟ್ ಬಳಸಿ ಅನ್ಸೈನ್ಡ್ ಟೈಪ್ನಲ್ಲಿ ಮಾಡುವ ಯಾವುದೇ ಕಳೆಯುವಿಕೆಗೆ ಸ್ಯಾಚುರೇಟಿಂಗ್ ಸಬ್ಟ್ರಾಕ್ಷನ್ (saturating subtraction) ಅಗತ್ಯವಿದೆ. 0 ಮತ್ತು 1 ಬಳಸಿ ಪರೀಕ್ಷಿಸಿ.
ಎನ್ಕೋಡಿಂಗ್ ಮತ್ತು ಎಡ್ಜ್ ಕೇಸ್ಗಳು (Encoding and Edge Cases) ಎನ್ಕೋಡಿಂಗ್ ನಿಯಮಗಳು ಸರಳವಾಗಿ ಕಾಣಿಸಬಹುದು, ಆದರೆ ನೀವು non-ASCII ಅಕ್ಷರಗಳನ್ನು ನೋಡುವವರೆಗೆ. ಜನರೇಟರ್ ಉತ್ಪಾದಿಸುವ ಸ್ಟ್ಯಾಕ್ಡ್ ಡಿಲಿಮಿಟರ್ಗಳೊಂದಿಗೆ Mistune ಸಮಸ್ಯೆಗಳನ್ನು ಎದುರಿಸುತ್ತಿತ್ತು. Unicode ಕಂಬೈನಿಂಗ್ ಮಾರ್ಕ್ಗಳನ್ನು ನಿರ್ವಹಿಸುವಾಗ Wenmode ವಿಫಲವಾಯಿತು. ರಿವ್ಯೂನಲ್ಲಿ ಇದು ಏಕೆ ತಪ್ಪಿಹೋಗುತ್ತದೆ: ASCII ಪ್ರತಿಯೊಂದು ಪರೀಕ್ಷೆಯಲ್ಲೂ ಪಾಸಾಗುತ್ತದೆ. ನೀವು ಕೈಯಿಂದ ಟೈಪ್ ಮಾಡದ ಇನ್ಪುಟ್ಗಳೊಂದಿಗೆ ಮಾತ್ರ ಈ ದೋಷಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ. ಪರಿಶೀಲನೆ: ಡಿಫರೆನ್ಶಿಯಲ್ ಟೆಸ್ಟ್ ಬಳಸಿ. ನಿಮ್ಮ ಔಟ್ಪುಟ್ ಅನ್ನು ವಿಭಿನ್ನವಾದ, ಸಾಬೀತಾದ ಇಂಪ್ಲಿಮೆಂಟೇಶನ್ನೊಂದಿಗೆ ಹೋಲಿಸಿ.
ಅಸುರಕ್ಷಿತ ಪಾರ್ಸಿಂಗ್ (Unsafe Parsing) Vite ನಲ್ಲಿ ಯಾವುದೇ ಗಾರ್ಡ್ ಇಲ್ಲದೆ URLಗಳನ್ನು ಡಿಕೋಡ್ ಮಾಡುವ ಮಿಡ್ಲ್ವೇರ್ ಇತ್ತು. ತಪ್ಪಾದ (malformed) URL ಅನ್ನು ನೀಡಿದಾಗ ಅದು URIError ಅನ್ನು ಎಸೆಯುತ್ತದೆ ಮತ್ತು ಮಿಡ್ಲ್ವೇರ್ ಕ್ರ್ಯಾಶ್ ಆಗುತ್ತದೆ. ಪರಿಶೀಲನೆ: ನೀವು ಸೃಷ್ಟಿಸದ ಯಾವುದೇ ವಿಷಯವನ್ನು ಡಿಕೋಡ್ ಅಥವಾ ಪಾರ್ಸ್ ಮಾಡುವಾಗ
try/catchಬ್ಲಾಕ್ ಅಗತ್ಯವಿದೆ. ನಿಮ್ಮ ಕೋಡ್ ಬಾಗುತ್ತದೆ ಅಥವಾ ಮುರಿಯುತ್ತದೆ ಎಂದು ನೋಡಲು ಅದಕ್ಕೆ ತಪ್ಪಾದ ಸ್ಟ್ರಿಂಗ್ಗಳನ್ನು ನೀಡಿ ಪರೀಕ್ಷಿಸಿ.
ನನ್ನ ಅಭ್ಯಾಸ ಸರಳವಾಗಿದೆ. ನಾನು ಒಂದು ದೋಷವನ್ನು ಸರಿಪಡಿಸಿದಾಗ, ಅದರ ಪಕ್ಕದಲ್ಲಿರುವ ಕೋಡ್ ಅನ್ನು ನೋಡುತ್ತೇನೆ. ಒಂದು ಹ್ಯಾಂಡ್ಲರ್ನಲ್ಲಿ ದೋಷವಿದ್ದರೆ, ಅದರ ಪಕ್ಕದ ಹ್ಯಾಂಡ್ಲರ್ನಲ್ಲಿಯೂ ಹೆಚ್ಚಾಗಿ ಅದೇ ರೀತಿಯ ದೋಷವಿರುತ್ತದೆ.
ಮೂಲ: https://dev.to/greymothjp/the-same-few-bugs-keep-hiding-in-libraries-you-already-trust-1pgp
