كيفية اعتراض استدعاء دالة مجانية مثل hippomocks؟

StackOverflow https://stackoverflow.com//questions/25079768

  •  02-01-2020
  •  | 
  •  

سؤال

أنا أتساءل ما الذي تفعله أفراس النهر لاعتراض exit وظيفة الاتصال على سبيل المثال كما هو موضح في الكود أدناه:

   MockRepository mocks;
   mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());
هل كانت مفيدة؟

المحلول

الكود الذي يقوم بالاعتراض موجود hippomocks.h.يقوم بتعديل إشارات حماية الذاكرة للسماح بالكتابة إلى عنوان مؤشر الوظيفة المتوفرة، ثم يكتب تعليمات الانتقال بدلاً من البايتات الأولية للوظيفة.عند عدم الحاجة إلى الخطاف، تتم استعادة البايتات الأصلية.وهذا هو نفس النهج المستخدم، على سبيل المثال، من قبل انعطافات مايكروسوفت مكتبة.

نصائح أخرى

فهو يلقي الوظيفة التي تم تمريرها (في هذه الحالة مؤشر دالة بسيط) إلى char *، ويطلب من نظام التشغيل السماح له بالكتابة إليها (باستخدام mprotect على Unices وVirtualProtect على Windows) ثم يعدل أول 5 إلى 14 بايت لتكون تعليمات القفز غير المشروطة.فهو يضع عنوان وظيفة تم إنشاؤها (باستخدام القوالب) بتوقيع مماثل في المكان، مما يؤدي إلى تجاوز الوظيفة بشكل فعال.

إذا أردت، يمكنك إعادة استخدام كود HippoMocks مباشرة، عن طريق إنشاء كائن من فئة Replace على المكدس باستخدام الوسائط الصحيحة.يمكنك أيضًا نسخ الكود (في أحدث إصدار من hippomocks.h على GitHub، يتم دعم كل من 32/64 بت x86 وARM والإبهام).إنه حول الخط 200، لذا فهو مرتفع نسبيًا.ستحتاج أيضًا إلى نسخ فئة Horrible_cast وفئة Unprotect؛الأول يسمح له بإرسال مؤشر وظيفة العضو إلى أي نوع آخر (وهو أمر غير ممكن مع reinterpret_cast) والثاني يلتف مكالمات إلغاء الحماية (وإعادة الحماية) الخاصة بنظام التشغيل.

أثناء تنظيف الكود الخاص بـ C++ 11، قمت أيضًا باستخراج هذه المجموعة الفرعية بالضبط، لذا يمكنك الآن استخدام ملف Detail/replace.h للحصول على الكود الذي يقوم بذلك فقط.للحصول على رابط مباشر، انظر https://github.com/dascandy/hippomocks/blob/cpp11/HippoMocks/detail/replace.h .

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