سؤال

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

الآن أعرف كيفية اكتشاف والتعافي من فائض المكدس في Windows (انظر http://support.microsoft.com/kb/315937). ومع ذلك ، لا أستطيع العثور على أي حل لنظام التشغيل Mac OS X.

يتم تطبيق VM في C ++: MSVC ++ على Windows ، GCC على Mac OS X.

من الناحية المثالية ، يجب أن تستند الآلية إلى إمكانات UNIX لأننا نخطط أيضًا للمناصة إلى Linux.

شكرًا.

هل كانت مفيدة؟

المحلول

يتمتع OCAML بنفس القيود التي تتوفر فيها (لغة البرمجة النصية "حيث قد يتسبب المبرمج في تدفق مكدس). يستخدم برنامج التحويل البرمجي الأصلي مكدس النظام لمكالمات الوظائف - كما تفعل - ويتولى تدفق المكدس (يتحقق منها كاستثناءات).

إذا لم تتلق إجابة أكثر وضوحًا ، أقترح عليك أن تنظر إلى كيفية القيام بها مصادر OCAML.

~/ppc $ cat >> t.ml

let rec f x = (f x) + (f x) ;;

f 0 ;;

~/ppc $ ocamlopt t.ml
~/ppc $ ./a.out 
Fatal error: exception Stack_overflow

ما سبق على Mac OS X Leopard. البحث عن #ifdef HAS_STACK_OVERFLOW_DETECTION في الملفات المصدر.

نصائح أخرى

ألا يمكنك تحديد حجم مكدس Max لبرنامجك ، وبداية المكدس ثم حساب نهاية Adress المكدس؟ قبل كل عملية في VM ، يمكنك بعد ذلك التحقق مما إذا كانت المكدس ستتفوق على (زيادة فوق العناوين القصوى) ثم رفع الاستثناء. هناك طريقة أخرى تتمثل في كتابة معرف بعد نهاية المكدس (مثل Deadbeef أو نحو ذلك) والتحقق من القيمة بعد كل عملية مكدس.


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

ولكن في الأساس - إذا كان لديك VM ، فلديك أيضًا مكان يقرأ الكود (مثل Bytecode) وتجمعه / يفسره. هذا هو المكان الذي يمكنك فيه التحقق من العلامة (مماثلة للشيكات للكشف عن فائض المخزن المؤقت المكدس).

القي نظرة على libsigsegv. إنها مكتبة C مع إجراءات لمساعدتك على تنفيذ معالج فائض المكدس ، من بين أشياء أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top