ما هو عنصر الفيض؟
هذه أسئلة وأجوبة وكان الجواب الذي كتبه k4thryn :
عنصر الفائض أو integer التغليف ، هي مشكلة محتملة في برنامج يستند إلى حقيقة أن القيمة التي يمكن أن تعقد في بيانات رقمية محدودة بسبب نوع البيانات في حجم بايت. وتستخدم المؤسسة الأمريكية الوطنية للمقاييس جيم الأحجام الدنيا التالية :
| نوع البيانات | الحجم (بايت) |
|---|---|
| تشار | 1 |
| قصير | 2 |
| int | 2 |
| طويل | 4 |
في الواقع ، تستخدم كثير من المجمعين 4 بايت int. كما ينبغي ملاحظة أن يتراوح الفعلية لأنواع البيانات تعتمد على ما إذا كانت أو لم تكن وقعت. على سبيل المثال ، وقعت 2 بايت قصيرة قد تكون بين -32767 و 32767 ، في حين أنه قد يكون من غير موقع القصير بين 0 و 65535. انظر الخاص بك [تشمل] / limits.h ملف لأرقام محددة للمجمع الخاص بك.
لماذا يجب أن يهمك الأمر؟ إذا كنت في محاولة لوضع القيمة إلى نوع البيانات التي هي صغيرة جدا لا تتسع لذلك ، من أجل بت عالية تسقط ، وفقط من أجل بت المنخفضة يتم تخزين. طريقة أخرى لقول ذلك هو أن مودولو بين الحساب يقوم على قيمة قبل تخزينه للتأكد من تناسبها ضمن البيانات. مع الأخذ في غير موقع القصير لدينا على سبيل المثال :
| الحد : | 65535 أو 1111 1111 1111 1111 |
| كبير جدا : | 65536 أو 1 0000 0000 0000 0000 |
| ما تم تخزينه : | 0 أو 0000 0000 0000 0000 |
كما ذكر أعلاه يجعل من الواضح أن النتيجة العالية لأن النظام (أو اليسار أكثر) نوعا من قيمة كبيرة جدا وهذا هو أسقطت. أو هل يمكن القول إن ما تم تخزينه هو نتيجة
= القيمة المخزنة في المائة (الحد + 1) أو 65536 ٪ (65535 + 1) = 0
وقعت في أنواع البيانات ، وكانت النتيجة مختلفة قليلا ، وبعض النتائج التي تبدو غريبة في السلوك :
| الحد الإيجابي : | 32767 أو 0111 1111 1111 1111 |
| كبير جدا : | 32768 أو 1000 0000 0000 0000 |
| ما تم تخزينه : | -32768 |
لماذا قال ذلك؟ انه بسبب "2's مجاملة "، وهي طريقة سلبية تتمثل في الأعداد الثنائية. لتقديم قصة قصيرة طويلة ، وخلال النصف الأول من مجموعة (0 من خلال 0111 1111 1111 1111) وتستخدم لاعداد ايجابية من أجل لأقل من أعظم. النصف الثاني من مجموعة ثم يتم استخدام الأرقام السلبية لأجل لأقل من أعظم. حتى السلبية لطائفة وقعت 2 بايت هو -32768 قصيرة خلال -1 ، في هذا النظام.
كنت نسأل لماذا لا تزال هذه المسائل ، ليست لك؟ لنفترض أن يجري تخصيص الذاكرة على أساس نوع بيانات غير موقعة integer قيمة. إذا كانت هذه القيمة قد لف حولها ، قد يكون ذلك إلا قدرا ضئيلا جدا من الذاكرة وسوف تتاح. أو إذا كان يجري مقارنة بين التوقيع على قيمة وعدد آخر ، على افتراض أن الرئيس السابق يجب ان يكون اقل من هذه الأخيرة ، إذا كانت هذه القيمة في الطيران سلبيا ، مقارنة ستنتقل. ولكن هناك اشياء اخرى على التصرف بالطريقة التي يقصد مبرمج؟ ربما لا.
مصادر إضافية للمعلومات عن Integer الفيضانات
في الوقت الذي يخرج عن نطاق هذا المقال ، وهناك غيرها من الموارد التي تذهب إلى مزيد من التفاصيل عن integer الفائض البق ، والوقاية منها ، واستغلالها. أي أن هناك اثنين من مواد مثيرة للاهتمام في Phrack # 60 (واحد من قبل عوديد Horovitz ، من جانب واحد blexim) integer الفائض الضعف. اختتام Integer أيضا مشمولة في "شفرة المصدر المراجعة المهنية" عرضا من الولايات المتحدة الأمريكية 2002 قبعة سوداء إحاطات (دود آخرين als).
أداة لتجربة مع Integer الفيضانات
البرنامج int_wrap.c يسمح لك للعب مع حول هذا السلوك عن طريق تحديد ما اذا كان سطر نوع البيانات (القصير) يجب أن لا تحمل توقيعا أو وقعت ، والقيمة التي تريد استخدامها.
ملاحظة : يبدو أن بيرل يكون الرقم 250 على الحد من أعداد ، ويموت مع الخطأ "عدد طويل جدا" (اختبار النسخة 5.8.0). ومع ذلك ، فإن عددا كبيرا من أرقام أقل بكثير من ذلك.
|
ضعف إدارة لالدمى
آخر رابط الوظائف
- مقابل Freshmeat سورس.






