تخطَّ إلى المحتوى

ما هو «خطر»؟

باختصار: خارج خطر يفحص المجمّع الحدود والتجاوز ويمنع العمليات الخام. داخل خطر: تكتب ما لا يُفحص: ذاكرة خام، وفهرسة مؤشر خام بلا طول، وتحويل بين أنواع المؤشرات، وبلا_فحص لتعطيل فحص بعينه. الخطأ هناك مسؤوليتك، لكنه محصور في كتلة تراها.

  • ذاكرة خام: احجز_خام(النوع, العدد) وفهرستها، لمخزن تمرّره إلى C مثلاً.
  • مؤشر خام (مؤشر_خام) يأتي من C، وقراءة ما يشير إليه.
  • التفاعل مع C حين يتطلب ذاكرة لا تديرها ميم: مخزن تملؤه دالة C، أو نص C بلا صفر في آخره.
  • تعطيل فحص بعينه بـ بلا_فحص في حلقة تعرف أنها آمنة.

وخارجي نفسه (التصريح بدالة C واستدعاؤها) لا يحتاج خطر حين تكون الأنواع عادية:

دالتان من C بلا خطر
خارجي "m" داله جذر_c(س كسر) كسر باسم "sqrt"
خارجي داله طول_c(ن نص) حجم باسم "strlen"
اطبع(جذر_c(2.0))
اطبع("ميم بالبايتات: ", طول_c("ميم"), "، وبالأحرف: ", طول("ميم"))
مخرجات مسجّلة من المجمّعmeem 17_خارجي.م · meem 0.10.0+b01b55f
1.4142135623730951ميم بالبايتات: 6، وبالأحرف: 3
ذاكرة خام داخل خطر
خطر:
م = احجز_خام(عدد32, 3)
م[0] = 10
م[1] = 20
م[2] = 30
اطبع(م[0] + م[1] + م[2])
حرر(م)
مخرجات مسجّلة من المجمّعmeem 17_خطر.م · meem 0.10.0+b01b55f
60

القوائم والقواميس والهياكل والوحدات القياسية تكفي أغلب البرامج، وكلها مفحوصة. والعملية الخام خارج خطر خطأ ترجمة:

احجز_خام خارج خطر
م = احجز_خام(عدد, 2)
مخرجات مسجّلة من المجمّعmeem 17_بلا_خطر.م · meem 0.10.0+b01b55f
​[خطأ دلالي E0414] سطر 1:5 - 'احجز_خام' لا تُكتب إلا داخل منطقة 'خطر'   1 | م = احجز_خام(عدد, 2)     |     ^~~~~~~~  تلميح: ضعها في كتلة  خطر:  أو في دالة معرَّفة بـ  خطر داله ...

رمز الخروج: 2

في فهرس الأخطاء: E0414

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

لكن تنبّه: ليست كل أخطاء الذاكرة داخل خطر. استعمال قائمة بعد حرر عبر اسم آخر ممكن في شيفرة عادية: يكشفه الكاشف في التشغيل المباشر، وفي الملف المبني بلا كاشف سلوك غير معرَّف. التفصيل في الذاكرة في ميم.

لتشغيل شيفرة لا تثق بها (برنامج من غيرك، أو تمرين طالب)، الخيار --no-unsafe يرفض أي خطر، و--no-ffi يرفض خارجي، و--no-system يرفض الوحدتين ملفات ونظام:

خطر مع --no-unsafe
خطر:
م = احجز_خام(عدد32, 1)
م[0] = 5
اطبع(م[0])
حرر(م)
مخرجات مسجّلة من المجمّعmeem --no-unsafe خطر_ممنوع.م · meem 0.10.0+b01b55f
​[خطأ دلالي E0415] سطر 1:1 - المنطقة 'خطر' ممنوعة بالخيار --no-unsafe   1 | خطر:     | ^~~  تلميح: هذا التشغيل لا يقبل الذاكرة اليدوية؛ استعمل القوائم والقواميس والوحدات القياسية.

رمز الخروج: 2

في فهرس الأخطاء: E0415

هذه الخيارات تقيّد ما يُكتب، ولا تعزل البرنامج: هو يعمل بصلاحياتك كاملة.

الدرس 18: «خطر» واستدعاء C · الطبقة المنخفضة · استدعاء C · ما يستطيعه البرنامج على جهازك