طفح عدد صحيح يحدث عندما تزيد القيمة المراد تخزينها عن المجال المتاح لنوع التخزين، بمعنى أن الذاكرة المتاحة لا تكفي تمثيل القيمة.
بالنسبة للأعداد الموجبة وكذلك السالبة في الأنظمة المتممة ثنائيا يؤدي الطفح إلى الرجوع لأصغر قيمة ممكنة، فمثلا نوع uint32_t حجمه 32 بت. في هذه الحالة سيعود إلى الصفر عند محاولة تخزين رقم 4294967296 (2 مرفوعة لأس 32) .
توفر المعالجات في العادة إمكانية الكشف عن حدوث طفح. مثلا عائلة x86 توفر OF (Overflow Bit) يمكن التأكد من قيمتها لضمان عدم حدوث طفح.
التعامل مع الطفح
اللغة | عدد صحيح دون إشارة | عدد صحيح ذو إشارة |
---|---|---|
سي | باقي قسمة العدد على سعة النوع | سلوك غير معرف |
سي++ | باقي قسمة العدد على سعة النوع | سلوك غير معرف |
سي شارب | System.OverflowException يتم إطلاقها إذا كان الكود بداخل checked {}[1] | |
جافا | النوع غير موجود | يتم العودة إلى أصغر قيمة ممكنة للنوع |
بايثون | النوع غير موجود | يتم التحويل إلى نوع أكبر |
بي إتش بي | النوع غير موجود | يتم التحويل إلى عدد ذو فاصلة عائمة |
في حالة أن لغة البرمجة لا تقوم بمراقبة سير العمليات الحسابية، يجب على المبرمج القيام بالاحتياطات اللازمة لمنع الطفح عند إجراء العمليات الحسابية، وذلك بالتأكد قبل العملية من أن نائج العملية وأي نتائج وسيطة ستكون داخل المجال المسموح. في لغة السي، يجب تولية عناية خاصة للطفح لأن طفح عدد صحيح ذو إشارة في السي يؤدي إلى سلوك غير معرف. لهذا السبب تقوم الكثير من معالجات السي باعتبار الطفح غير ممكن الحدوث، وتقوم با الاستمثال على ذلك الأساس وربما يؤدي ذلك إلى نتائج خاطئة وأحيانا كارثية.
في اللغات التي لا تشترط تحديد نوع معين للمتغير، يتم عادة تحويل المتغير إلى نوع عدد صحيح جديد لمنع الطفح. من الأمثلة على ذلك بايثون وروبي بينما تقوم لغات مثل PHP بالتحويل إلى نوع فاصلة عائمة.
في حالة حدوث طفح لم يتم التعامل معه ربما يتغير سير البرنامج. يتمكن المستخدم جراء ذلك من التأثير على عمل البرنامج بطرق لم يخطط لها المبرمج وهو مايؤدي إلى ثغرات أمنية.
روابط خارجية
- Phrack #60, Basic Integer Overflows
- Phrack #60, Big Loop Integer Protection
- How to implement efficiently in C
- WASC Threat Classification - Integer Overflows
مراجع
- Checked and Unchecked (C# Reference) - تصفح: نسخة محفوظة 16 نوفمبر 2016 على موقع واي باك مشين.