سؤال

لتطوير C ++ لأنظمة 32 بت (كن Linux، Mac Os. أو النوافذ، PowerPC أو x86) لقد قمت بتوجيه المؤشرات التي من شأنها أنه غير محدد (على سبيل المثال، لا يمكنهم على الفور الحصول على قيمة مناسبة) مثل ذلك:

int *pInt = reinterpret_cast<int *>(0xDEADBEEF);

(لحفظ الكتابة والكوني جاف سيكون الجانب الأيمن عادة ثابتا، مثل bad_ptr.)

إذا تم تغيير نصف القيمة قبل أن تحصل على قيمة مناسبة، فسوف يتعطل فورا على معظم الأنظمة (بدلا من التعطل في وقت لاحق عندما يتم الكتابة فوق بعض الذاكرة أو الذهاب إلى حلقة طويلة جدا).

بالطبع السلوك يعتمد على الأجهزة الأساسية (الحصول على عدد صحيح 4 بايت من العنوان الفردي 0xDeadbeef من عملية المستخدم قد يكون صالحا تماما)، ولكن تعطل تم موثوقية 100٪ لجميع الأنظمة التي قمت بتطويرها حتى الآن ( Mac Os. 68XXX., ، نظام التشغيل Mac OS PowerPC، Linux Redhat Pentium، Windows Gui Pentium، Windows Console Pentium). على سبيل المثال على PowerPC، فمن غير القانوني (خطأ الحافلات) لجلب عدد صحيح 4 بايت من عنوان غريب.

ما هي قيمة جيدة لهذا على أنظمة 64 بت؟

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

المحلول

عموما لا يهم بالضبط ما النمط الذي تكتبه، يهم أنه يمكنك تحديد النمط من أجل تحديد مكان حدوث مشاكل. يحدث ذلك فقط أنه في نواة Linux غالبا ما يتم اختيارها بحيث يمكن محاصرة إذا تم تغيير العناوين.

إلقاء نظرة في نواة لينكس في تشمل / linux / poison.h. وبعد يحتوي هذا الملف على قيم سمية مختلفة للعديد من الأنظمة الفرعية Kernel مختلفة. لا توجد قيمة سمية واحدة مناسبة.

أيضا، قد تحقق في الهندسة المعمارية على الملفات في شجرة مصدر Linux Kernel للحصول على معلومات حول ما يستخدم في بنية محددة.

نصائح أخرى

0xBADC0FFEE0DDF00D

وفقا ل Wikipedia, ، يتم استخدام badc0ffee0df00d على أنظمة IBM RS / 6000 64 بت للإشارة إلى سجلات وحدة المعالجة المركزية غير المهوية.

معظم أنظمة 64 بت الحالية تتيح لك استخدام فقط أدنى 248–252 بت مساحة العنوان؛ يجب أن تكون أجزاء أعلى من العنوان كلها صفر. بعض الرقائق (مثل AMD64) تتيح لك أيضا استخدام أعلى 248–252. وبعد لا يمكن تعيين عناوين خارج هذه النطاقات لذاكرة يمكن الوصول إليها؛ الأجهزة ببساطة لن تسمح بذلك.

لذلك أوصي بك استخدام قيمة قريبة من 263, ، والتي ليست بالقرب من أي من المساحات التي يمكن استخدامها ربما. إذا كانت الأرقام الرائدة الرباعية الأربعة 7FF8، فستكون القيمة نقطة نان مزدوجة بدقة مزدوجة، وهي مريحة. لذلك بلدي العبارة الست عشرية لطيف المقترحة هي 0x7FF8Badfbadfbadf.

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

أنا أفترض أنك قمت بالفعل بخصم فارغة (أي 0 دون typecast). إنه بالتأكيد هو الاختيار الأكثر أمانا، من الناحية النظرية، مؤشر صالح استطاع أشر إلى عنوان الذاكرة 0xDeadBeef (أو أي عنوان ذاكرة غير فارغ آخر).

0xDEADBEEFBAADF00D قد تعمل.

ليس لدي خيار جيد لك، لكن إليك قائمة كلمات الحكا العامة أنه يمكنك استخدامها لجعل عباراتك.

يجب أن تكون اثنين 0xDeadbeeFs كافية، وأعتقد ..

أرى العديد من الإجابات المطالبة ب NULL هي خيار جيد، لكنني لا أوافق.

غالبا ما يستخدم NULL كقيمة إرجاع صالحة من الوظائف. يشير إلى عودة الفشل أو قيمة غير معروفة. هذا هو معنى مختلف من "المؤشر غير الأكبر".

عند استخدام مصحح الأخطاء على التعليمات البرمجية ومعرفة NULL، سيترك بإمكانتين: لم تتم تهيئة المؤشر مطلقا أو فشلت في تخصيص الذاكرة.

تعيين المؤشر غير المهيمين إلى 0xDeadbeef أو مكافئ 64 بت يعني أن مؤشر فارغا يشير إلى قيمة متعمدة.

ذلك يعتمد على نظام التشغيل والبيئة، بالطبع. لا أعتقد أن 0xDeadbeef هو بالضرورة مؤشرا سيئا في نظام تعسفية 32 بت، سواء.

بشكل واقعي، يجب أن يتمكن أي نظام تشغيل حديث لحماية الصفحات القليلة الأولى من ذاكرة العملية، لذلك يجب أن تكون NULL أن تكون قيمة مؤشر غير صالحة جيدة. بشكل مريح بما فيه الكفاية، هو بالفعل محددة مسبقا بالنسبة لك.

0x42 يمكن أن تعمل على كل من 32 بت و 64bit؟ (لا يزال يتعين عليه أن يؤدي إلى حدوث تعطل لأنه قريب بما فيه الكفاية بمؤشر NULL، وبالنظر إلى أنه كبير نوعا كبيرا، فمن المحتمل أنك لن يكون لديك ضمن ديرليل منتظم من حقل هيكل مع مؤشر الهيكل بغيض).

نظرا لأن النظام الذي عملت فيه بشكل أساسي يعمل على منصة X86_64، فإن القيمة التي أستخدمها هي:

0xDEADBEEFDEADBEEF

الأسباب هي:

  • على منصة X86_64، يتم استخدام فقط 48 بت منخفضة 48 بتطبيق الذاكرة الظاهرية في التنفيذ الحالي، وهذا يعني أن أي قيمة> 2 ^ 48 يجب أن تعمل: https://en.wikipedia.org/wiki/x86-64.
  • كما 0xDEADBEEF هو بالفعل معروف جيدا لهذا الغرض في 32bit، 0xDEADBEEFDEADBEEF في 64bit هو أكثر "متوافق مع الوراء"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top