التحقق من الحدود

في برمجة الحاسوب ، يُعدّ فحص الحدود أي طريقة للتحقق مما إذا كان متغير ما يقع ضمن نطاق معين قبل استخدامه. ويُستخدم عادةً للتأكد من أن رقمًا ما ينتمي إلى نوع بيانات محدد (فحص النطاق)، أو أن متغيرًا يُستخدم كمؤشر في مصفوفة يقع ضمن نطاق المصفوفة (فحص المؤشر). ويؤدي فشل فحص الحدود عادةً إلى توليد إشارة استثناء .

بما أن إجراء فحص الحدود في كل استخدام قد يستغرق وقتًا طويلاً، فإنه لا يُجرى دائمًا. يُعدّ حذف فحص الحدود تقنية لتحسين أداء المُصرّف ، حيث يُلغي فحص الحدود غير الضروري.

فحص المدى

يتحقق فحص النطاق من أن الرقم يقع ضمن نطاق مناسب لعمل البرنامج، مثل التأكد من أن القيمة المراد إسنادها إلى عدد صحيح ذي 16 بت تقع ضمن سعة هذا العدد (أي التحقق من عدم تجاوز النطاق ). يختلف هذا قليلاً عن فحص النوع ، الذي يتحقق من أن نوع البيانات مناسب لنظام أنواع البرنامج. قد تكون فحوصات النطاق الأخرى أكثر تقييدًا؛ على سبيل المثال، قد يُصرَّح عن متغير لتخزين رقم شهر ميلادي بحيث يقبل النطاق من 1 إلى 12 فقط.

مثال بلغة بايثون :

دالة set_month ( month : int ): إذا كان month < 1 أو month > 12 : ارفع ValueError ( "يجب أن يكون الشهر بين 1 و 12" )

فحص الفهرس

يعني التحقق من الفهرس أنه في جميع التعبيرات التي تستخدم الفهرسة في مصفوفة، يتم التحقق من قيمة الفهرس مقابل حدود المصفوفة (التي تم تحديدها عند تعريف المصفوفة)، وإذا كان الفهرس خارج الحدود، يتم تعليق التنفيذ بسبب خطأ ما. ولأن قراءة أو كتابة قيمة خارج حدود المصفوفة قد يتسبب في خلل في البرنامج أو تعطلّه أو استغلال ثغرات أمنية (انظر تجاوز سعة المخزن المؤقت )، فإن التحقق من الفهرس يُعد جزءًا أساسيًا من العديد من لغات البرمجة عالية المستوى .

تضمنت لغات البرمجة المترجمة المبكرة التي تتمتع بإمكانية فحص الفهرس ALGOL 60 و ALGOL 68 و Pascal ، بالإضافة إلى لغات البرمجة المفسرة مثل BASIC .

لا تُجري العديد من لغات البرمجة، مثل لغة C ، فحصًا تلقائيًا للحدود بهدف زيادة السرعة. ومع ذلك، فإن هذا يُؤدي إلى عدم اكتشاف العديد من أخطاء تجاوز الحدود وتجاوزات سعة المخزن المؤقت . ويعتقد العديد من المبرمجين أن هذه اللغات تُضحي بالكثير من أجل سرعة التنفيذ. [ 1 ] في محاضرته بمناسبة حصوله على جائزة تورينج عام 1980 ، وصف كار هوار تجربته في تصميم لغة ALGOL 60 ، وهي لغة تضمنت فحص الحدود، قائلاً:

نتيجةً لهذا المبدأ، كان يتم التحقق من كل ظهور لكل فهرس لكل متغير مُفهرس في كل مرة أثناء التشغيل، وذلك بمقارنته بالحدود العليا والدنيا المُعلنة للمصفوفة. بعد سنوات عديدة، سألنا عملاءنا عما إذا كانوا يرغبون في توفير خيار لإيقاف هذه الفحوصات حرصًا على كفاءة عمليات الإنتاج. أجمعوا على رفضهم، فقد كانوا يدركون مدى تكرار أخطاء الفهرسة في عمليات الإنتاج، حيث قد يكون عدم اكتشافها كارثيًا. ألاحظ بقلق بالغ أنه حتى في عام ١٩٨٠، لم يستوعب مصممو اللغات ومستخدموها هذا الدرس. في أي فرع هندسي محترم، كان عدم مراعاة هذه الاحتياطات الأساسية يُعد مخالفة للقانون منذ زمن طويل.

تشمل لغات البرمجة الشائعة التي تُفعّل التحقق أثناء التشغيل: Ada و C# و Haskell و Java و JavaScript و Lisp و PHP و Python و Ruby و Rust و Visual Basic . تحتوي لغتا D و OCaml على خاصية التحقق من حدود وقت التشغيل، والتي يُمكن تفعيلها أو تعطيلها باستخدام مُبدّل في المُصرّف. في لغة C++، لا يُعدّ التحقق أثناء التشغيل جزءًا من اللغة نفسها، بل هو جزء من مكتبة STL ، ويُفعّل باستخدام مُبدّل في المُصرّف (_GLIBCXX_DEBUG=1 أو _LIBCPP_DEBUG=1). تدعم لغة C# أيضًا المناطق غير الآمنة : وهي أجزاء من التعليمات البرمجية التي تُعلّق (من بين أمور أخرى) التحقق من الحدود مؤقتًا لرفع الكفاءة. تُفيد هذه المناطق في تسريع الاختناقات الزمنية الصغيرة الحرجة دون المساس بسلامة البرنامج ككل.

تستطيع لغة البرمجة JS ++ تحليل ما إذا كان فهرس المصفوفة أو مفتاح الخريطة خارج النطاق أثناء وقت الترجمة باستخدام الأنواع الموجودة ، وهي نوع اسمي يصف ما إذا كان الفهرس أو المفتاح ضمن النطاق أم خارجه، ويوجه عملية توليد الكود. وقد ثبت أن الأنواع الموجودة لا تضيف سوى 1 مللي ثانية إلى وقت الترجمة. [ 2 ]

فحص حدود الأجهزة

تتطلب ميزة الأمان التي يوفرها فحص الحدود بالضرورة وقتًا إضافيًا من وحدة المعالجة المركزية إذا تم إجراؤه برمجيًا؛ أما إذا أمكن إجراؤه بواسطة مكونات مادية، فيمكن توفير الأمان "مجانًا" دون أي تكلفة على وقت التشغيل. كان نظام ICL 2900 Series، الذي أُعلن عنه عام 1974، من أوائل الأنظمة التي اعتمدت فحص الحدود المادي. [ 3 ] يحتوي حاسوب VAX على تعليمة INDEX في لغة التجميع لفحص فهرس المصفوفة، والتي تأخذ ستة معاملات، جميعها تدعم أي نمط عنونة VAX . أجرى حاسوب B6500 وحواسيب Burroughs المماثلة فحص الحدود عبر المكونات المادية، بغض النظر عن لغة البرمجة المستخدمة في تجميع رمز الآلة . يحتوي عدد محدود من وحدات المعالجة المركزية اللاحقة على تعليمات متخصصة لفحص الحدود، مثل تعليمة CHK2 في سلسلة Motorola 68000 .

بدأت الأبحاث منذ عام 2005 على الأقل حول طرق استخدام وحدة إدارة الذاكرة الافتراضية المدمجة في معالجات x86 لضمان سلامة الوصول إلى المصفوفات والمخازن المؤقتة. [ 4 ] في عام 2015، قدمت إنتل امتدادات Intel MPX في معمارية معالج Skylake ، والتي تخزن الحدود في سجل وحدة المعالجة المركزية والجدول في الذاكرة. اعتبارًا من أوائل عام 2017، يدعم GCC على الأقل امتدادات MPX.

انظر أيضاً

مراجع

  1. كوان، سي؛ واغل، إف؛ كالتون بو؛ بيتي، إس؛ والبول، جيه (1999). "تجاوزات سعة المخزن المؤقت: هجمات ودفاعات ضد ثغرة العقد". وقائع مؤتمر ومعرض داربا لبقاء المعلومات. DISCEX'00 . المجلد  2. الصفحات 119-129 . doi : 10.1109/DISCEX.2000.821514 . ISBN  978-0-7695-0490-2. S2CID 167759976 . 
  2. "JS++ 0.9.0: تحليل فعال لأخطاء تجاوز الحدود أثناء وقت الترجمة - مدونة JS++" . 11 يناير 2019. مؤرشف من الأصل بتاريخ 12 يناير 2019.
  3. جيه كيه باكلي (1978). سلسلة ICL 2900 (ملف PDF) . سلسلة ماكميلان لعلوم الحاسوب. الصفحات 17، 77. ISBN  978-0-333-21917-1أُرشف من النسخة الأصلية (PDF) بتاريخ 20 أبريل 2018. تم الاطلاع عليه بتاريخ 20 أبريل 2018 .
  4. لاب-تشونغ لام؛ تزي-كر تشيوه (2005). "التحقق من انتهاك حدود المصفوفة باستخدام أجهزة التجزئة". المؤتمر الدولي لعام 2005 حول الأنظمة والشبكات الموثوقة (DSN'05) . الصفحات 388-397 . doi : 10.1109/DSN.2005.25 . ISBN  0-7695-2282-3. S2CID 6278708 .