نفس الأخطاء البرمجية القليلة التي تختبئ في مكتباتك الموثوقة
أقضي بعض الوقت في إرسال إصلاحات صغيرة إلى مستودعات برمجية ضخمة مثل Langchain وVite وBat.
تستخدم هذه المشاريع لغات ومجالات مختلفة، والمشرفون عليها خبراء.
الجزء المثير للدهشة ليس عدد الأخطاء، بل الأنماط. فمعظم الأخطاء هي مجرد أشكال قليلة متشابهة ترتدي ملابس مختلفة.
بمجرد أن تطلق أسماءً على هذه الأشكال، ستتمكن من رصدها قبل وصولها إلى مرحلة الإنتاج. إليك خمسة أنماط شائعة أجدها:
مفاتيح الإدخال الخاطئة (Wrong Input Keys) في Langchain، كانت إحدى وظائف إعادة التسمية تبحث عن مفتاح يسمى
old_path. بينما كان النظام يرسل في الواقع مفتاحًا يسمىpath. أدى ذلك إلى تعطل الكود. لماذا تمر من المراجعة: نجح اختبار الوحدة (unit test) لأن المطور قام ببناء المدخلات التي تتوقعها الوظيفة يدويًا، وليس المدخلات التي يرسلها النظام فعليًا. طريقة التحقق: إذا كانت الوظيفة تقرأ مفتاحًا ما، فابحث عن المكان الذي يتم فيه بناء ذلك الكائن. إذا لم يقم أي شيء بتعيين ذلك المفتاح، فقد وجدت خطأً. اختبر الكود مقابل المستدعي الحقيقي.فخاخ القيم المنطقية (Truthiness Traps) خطأ شائع هو استخدام فحص الـ truthiness عندما يكون القصد هو "هل هذه القيمة محددة؟". مثال:
const clause = defaultValue ?DEFAULT ${defaultValue}: '';إذا كانت القيمة 0، سيتخطى الكود هذا المسار. الرقم 0 قيمة حقيقية، لكنه يُعتبر "falsy". طريقة التحقق: اختبر دائمًا الرقم 0، والسلاسل النصية الفارغة، والقيمة false. إذا لم يستطع الكود التمييز بين "المفقود" و"الموجود ولكن قيمته صفر"، فهو معطل.نقص عدد صحيح غير مُوقع (Unsigned Integer Underflow) في مشروع Bat، استُخدمت العمليات الحسابية لحساب عرض الطرفية (terminal width). إذا كان العرض صغيرًا جدًا، فإن عملية الطرح تؤدي إلى حدوث underflow. في الأنواع غير المُوقعة (unsigned types)، يؤدي هذا إلى الالتفاف إلى رقم ضخم أو تعطل البرنامج. طريقة التحقق: أي عملية طرح على نوع غير مُوقع باستخدام مدخلات المستخدم تتطلب عملية طرح مشبعة (saturating subtraction). اختبر باستخدام 0 و1.
الترميز والحالات الحدية (Encoding and Edge Cases) تبدو قواعد النصوص بسيطة حتى ترى أحرفًا غير تابعة لـ ASCII. واجهت Mistune مشكلات مع المحددات المتراكمة التي قد ينتجها المولد (generator). وفشل Wenmode عند التعامل مع علامات Unicode المركبة. لماذا تمر من المراجعة: تمر أحرف ASCII من كل الاختبارات. لا تظهر الأخطاء إلا مع المدخلات التي لا تكتبها يدويًا. طريقة التحقق: استخدم اختبارًا تفاضليًا (differential test). قارن مخرجاتك مع تنفيذ آخر مختلف ومثبت.
التحليل غير الآمن (Unsafe Parsing) كان لدى Vite برنامج وسيط (middleware) يقوم بفك ترميز عناوين URL بدون حماية. أي عنوان URL مشوه سيؤدي إلى إطلاق URIError وتعطل البرنامج الوسيط. طريقة التحقق: أي شيء تقوم بفك ترميزه أو تحليله ولم تقم بإنشائه بنفسك يحتاج إلى كتلة
try/catch. قم بإرسال سلاسل نصية تالفة إلى الكود الخاص بك لترى ما إذا كان سيتحمل أم سينهار.
عادتي بسيطة؛ عندما أقوم بإصلاح خطأ ما، أنظر إلى الكود المجاور له مباشرة. إذا كان أحد المعالجات (handlers) يحتوي على خطأ، فغالبًا ما يكون للمعالج الشقيق نفس النمط.
المصدر: https://dev.to/greymothjp/the-same-few-bugs-keep-hiding-in-libraries-you-already-trust-1pgp
