تجاوز سعة عدد صحيح

في برمجة الحاسوب ، يحدث تجاوز عدد صحيح عندما تحاول عملية حسابية على الأعداد الصحيحة إنشاء قيمة عددية خارج النطاق الذي يمكن تمثيله في المساحة المخصصة للنتيجة - إما أعلى من الحد الأقصى أو أقل من الحد الأدنى للقيمة القابلة للتمثيل.
تستخدم معظم العمليات الحسابية للأعداد الصحيحة في الحوسبة الحديثة التمثيل الثنائي للأعداد الصحيحة، على الرغم من وجود التمثيل العشري أيضًا. ستركز هذه المقالة على التمثيل الثنائي، مع العلم أن الاعتبارات المماثلة تنطبق على الحالة الأخرى.
يمكن تفسير العدد الصحيح المُمثَّل بنمط بتات في الحاسوب إما كعدد صحيح غير مُوَقَّع (تتراوح قيمته بين 0 وقيمة قصوى معينة) أو كعدد صحيح مُوَقَّع (تكون قيمته موجبة أو سالبة). في أغلب الأحيان، تُمثَّل الأعداد الصحيحة المُوَقَّعة بنظام المتمم الثنائي ، حيث تُفسَّر البتة الأعلى قيمة على أنها الإشارة (0 للإشارة الموجبة، و1 للإشارة السالبة). على سبيل المثال، في كلمة مكونة من 32 بت، تتراوح قيمة العدد الصحيح غير المُوَقَّع بين 0 و2³² - 1 = 4,294,967,295 ، بينما تتراوح قيمة العدد الصحيح المُوَقَّع بين -2³¹ = -2,147,483,648 و2³¹ - 1 = 2,147,483,647 .
ينتج عن تجاوز سعة عدد صحيح قيمة مخزنة تختلف عن القيمة الرياضية التي تشير إليها العملية التي تم تنفيذها. في أغلب الأحيان، يكون نمط البتات الناتج هو نفسه كما لو تم تنفيذ العملية بتردد 2^ W ، حيث W هو حجم الكلمة بالبتات. كما تقوم العملية بتعيين أو إلغاء تعيين علامة واحدة أو أكثر تشير إلى حدوث تجاوز السعة. في بعض المعالجات، مثل وحدات معالجة الرسومات (GPUs) ومعالجات الإشارات الرقمية (DSPs) التي تدعم حساب التشبع ، قد يتم تقييد نتائج تجاوز السعة ، أي تعيينها إلى الحد الأدنى للقيمة في النطاق القابل للتمثيل إذا كانت النتيجة أقل من الحد الأدنى، وتعيينها إلى الحد الأقصى للقيمة في النطاق القابل للتمثيل إذا كانت النتيجة أعلى من الحد الأقصى.
إذا لم يتوقع المبرمج حدوث تجاوز في عدد صحيح، فقد يؤثر ذلك سلبًا على موثوقية البرنامج وأمانه .
أصل
يحدث تجاوز سعة الأعداد الصحيحة عندما تحاول عملية حسابية على الأعداد الصحيحة إنشاء قيمة عددية خارج النطاق الذي يمكن تمثيله بعدد معين من الأرقام. في سياق برمجة الحاسوب، تُستخدم الأعداد الصحيحة بنظام العد الثنائي ، ولكن أي نظام عددي موضعي قد ينتج عنه نتيجة غير صالحة لعملية حسابية إذا كانت المواضع محدودة. كما هو موضح في مثال عداد المسافات، باستخدام النظام العشري ، ومع وجود قيد 6 مواضع ( أرقام )، ستكون نتيجة العملية التالية غير صالحة: 999999 + 1. وبالمثل، فإن النظام الثنائي المحدود بـ 4 مواضع ( بتات ) ستكون نتيجة العملية التالية غير صالحة . في كلا المثالين، ستكون قيمة النتائج أكبر من النطاق الذي يمكن تمثيله بالقيود. طريقة أخرى للنظر إلى هذه المشكلة هي أن عملية الموضع الأكثر أهمية تتضمن عملية حمل تتطلب تخصيص موضع/رقم/بت إضافي، مما يخالف القيود.1111 + 0001
تخضع جميع الأعداد الصحيحة في برمجة الحاسوب لقيودٍ تتمثل في حد أقصى وحد أدنى. وتتحدد هذه القيود بشكل أساسي من خلال تخصيص البتات، وما إذا كان العدد صحيحًا مُوَقَّعًا أم لا . يعتمد العدد الصحيح القياسي على النظام الأساسي ولغة البرمجة . ويمكن أن تكون تمثيلات الأعداد الصحيحة الإضافية أصغر أو أكبر من العدد القياسي، مثل العدد الصحيح القصير والعدد الصحيح الطويل على التوالي. كما توجد تمثيلات ذات دقة اختيارية ، ولكنها ستكون محدودة بالدقة المُحددة مسبقًا أو بذاكرة النظام المتاحة.
| أجزاء | الاسم المستعار [ أ ] | يتراوح | النطاق المُوَقَّع [ ب ] | نطاق غير موقع |
|---|---|---|---|---|
| 8 بت | بايت ، [ 1 ] [ ج ] بايت صغير، [ 2 ] ثماني | 2 8 − 1 | -128 [ 3 ] | 0 [ 4 ] |
| 127 [ 5 ] | 255 [ 6 ] | |||
| 16 بت | كلمة ، قصيرة ، عدد صحيح 16 بت، [ 7 ] عدد صحيح غير موجب 16 بت [ 8 ] | 2 16 − 1 | -32,768 [ 9 ] | 0 [ 10 ] |
| 32,767 [ 11 ] | 65,535 [ 12 ] | |||
| 32 بت [ د ] | int32, [ 13 ] uint32 [ 14 ] | 2 32 − 1 | -2,147,483,648 [ 15 ] | 0 [ 16 ] |
| 2,147,483,647 [ 17 ] | 4,294,967,295 [ 18 ] | |||
| 64 بت [ هـ ] | int64, [ 19 ] uint64 [ 20 ] | 2 64 − 1 | −9,223,372,036,854,775,808 [ 21 ] | 0 [ 22 ] |
| 9,223,372,036,854,775,807 [ 23 ] | 18,446,744,073,709,551,615 [ 24 ] | |||
| 128 بت | int128, [ 25 ] uint128 [ 26 ] | 2 128 − 1 | -170,141,183,460,469,231,731,687,303,715,884,105,728 | 0 |
| 170,141,183,460,469,231,731,687,303,715,884,105,727 | 340,282,366,920,938,463,463,374,607,431,768,211,455 | |||
- ↑ يستخدم نوع البيانات العددية الصحيحة (int) عادةً نظام المتمم الثنائي، وبالتالي فهي أعداد ذات إشارة. يشير الحرف 'u' إلى التنفيذ غير الموقّع.
- ↑ تفترض النطاقات الموقعة استخدام المتمم الثنائي
- ↑ يكون نوع بيانات البايت عادةً غير مُوقّع افتراضيًا. يشير البادئة 's' إلى التنفيذ المُوقّع.
- ↑ الأكثر شيوعًا لأجهزة الكمبيوتر الشخصية اعتبارًا من عام 2005.
- ↑ الأكثر شيوعاً لأجهزة الكمبيوتر الشخصية اعتباراً من عام 2025.
عندما تنتج عملية حسابية غير موقعة نتيجة أكبر من الحد الأقصى المذكور أعلاه لعدد صحيح مكون من N بت، فإن تجاوز السعة يقلل النتيجة إلى القوة N للعدد 2، مع الاحتفاظ فقط بأقل البتات أهمية من النتيجة ويتسبب بشكل فعال في التفاف حولها .
على وجه الخصوص، قد يؤدي ضرب أو جمع عددين صحيحين إلى قيمة صغيرة بشكل غير متوقع، وقد يؤدي الطرح من عدد صحيح صغير إلى التفاف إلى قيمة موجبة كبيرة (على سبيل المثال، ينتج عن جمع عدد صحيح مكون من 8 بت 255 + 2 القيمة 1، وهي 257 mod 2 8 ، وبالمثل ينتج عن طرح 0 − 1 القيمة 255، وهي تمثيل مكمل ثنائي للعدد −1).
قد يتسبب هذا الالتفاف في أضرار أمنية - إذا تم استخدام قيمة فائضة كعدد البايتات المراد تخصيصها للمخزن المؤقت، فسيتم تخصيص المخزن المؤقت بشكل صغير بشكل غير متوقع، مما قد يؤدي إلى تجاوز سعة المخزن المؤقت ، والذي قد يتسبب بدوره، اعتمادًا على استخدام المخزن المؤقت، في تنفيذ تعليمات برمجية عشوائية.
إذا كان نوع المتغير عددًا صحيحًا مُوَقَّعًا ، فقد يفترض البرنامج أن المتغير يحتوي دائمًا على قيمة موجبة. قد يؤدي تجاوز سعة المتغير إلى التفاف القيمة لتصبح سالبة، مما يُخالف افتراض البرنامج وقد يُسبب سلوكًا غير متوقع (على سبيل المثال، ينتج عن جمع 127 + 1 ، أي عدد صحيح ذو 8 بتات ، -128، وهو المتمم الثنائي للعدد 128). (يُمكن حل هذه المشكلة تحديدًا باستخدام أنواع الأعداد الصحيحة غير المُوَقَّعة للقيم التي يتوقعها البرنامج ويفترض أنها لن تكون سالبة أبدًا).
الأعلام
تحتوي معظم أجهزة الكمبيوتر الحديثة على علامات معالجة مخصصة يتم ضبطها عند حدوث تجاوز في عمليات الجمع والطرح.
يتم تفعيل علامة الحمل عندما لا تتسع نتيجة عملية جمع أو طرح، مع اعتبار المعاملات والنتيجة أعدادًا غير مُوقّعة، ضمن عدد البتات المُعطى. وهذا يُشير إلى حدوث تجاوز مع حمل أو استلاف من البت الأكثر أهمية .
يتم تفعيل علامة تجاوز السعة عندما لا تتوافق إشارة ناتج عملية جمع أو طرح الأعداد الموقعة مع الإشارة المتوقعة من إشارات المعاملات، على سبيل المثال، نتيجة سالبة عند جمع عددين موجبين. يشير هذا إلى حدوث تجاوز للسعة، وأن النتيجة الموقعة المُمثلة بنظام المتمم الثنائي لا تتسع لعدد البتات المُحدد. بالنسبة لتعليمات الجمع (ADD)، يعني هذا أن قيمة الحمل الداخل إلى بت الإشارة تختلف عن قيمة الحمل الخارج منه.
تنوع التعريفات والغموض
بالنسبة للأنواع غير الموقعة، عندما تكون النتيجة المثالية لعملية ما خارج نطاق تمثيل النوع، ويتم الحصول على النتيجة المُعادة عن طريق الالتفاف، يُعرَّف هذا الحدث عادةً على أنه تجاوز. في المقابل، يُعرّف معيار لغة C هذا الحدث على أنه ليس تجاوزًا، وينص على أن "العملية الحسابية التي تتضمن معاملات غير موقعة لا يمكن أن تتجاوز النطاق أبدًا". [ 27 ] ويكمن التفسير في أن المعيار يُعرّف العمليات الحسابية مع الأعداد الصحيحة غير الموقعة على أنها عمليات حسابية بتردد 2W ، حيث W هو حجم الكلمة، وهو مُعرَّف رياضيًا بدقة، ولا يملك إلا قيمًا قابلة للتمثيل.
عندما تقع النتيجة المثالية لعملية حسابية على عدد صحيح خارج نطاق تمثيل النوع، ويتم الحصول على النتيجة المُعادة عن طريق التقييد، يُعرَّف هذا الحدث عادةً باسم التشبع. ويختلف استخدام مصطلح "التشبع" فيما إذا كان يُعدّ تجاوزًا أم لا. ولتجنب الالتباس، يمكن استخدام مصطلحي "تجاوز الالتفاف" [ 28 ] و"تجاوز التشبع" [ 29 ] .
تُعرف حالة عملية حسابية على عدد صحيح تُنتج قيمة أقل من أصغر قيمة قابلة للتمثيل أحيانًا باسم " نقص التدفق" للأعداد الصحيحة ، على الرغم من أنها تُعرف في الغالب باسم "زيادة التدفق". [ 30 ] يختلف هذا الاستخدام تمامًا عن نقص التدفق في الأعداد العشرية ، والذي يشير إلى قيمة عشرية قريبة جدًا من الصفر.
سلوك غير متسق
قد لا يكون سلوك البرنامج عند حدوث تجاوز السعة متسقًا في جميع الظروف. على سبيل المثال، في لغة Rust ، على الرغم من توفير وظائف تمنح المستخدمين خيارات وتحكمًا، إلا أن سلوك الاستخدام الأساسي للمعاملات الرياضية ثابت بطبيعته؛ ومع ذلك، يختلف هذا السلوك الثابت بين برنامج تم إنشاؤه في وضع "التصحيح" وآخر تم إنشاؤه في وضع "الإصدار". [ 31 ] في لغة C، يُعرَّف تجاوز سعة الأعداد الصحيحة غير الموقعة بأنه التفاف، بينما يتسبب تجاوز سعة الأعداد الصحيحة الموقعة في سلوك غير مُعرَّف .
طرق لمعالجة مشاكل تجاوز سعة الأعداد الصحيحة
| لغة | عدد صحيح غير مُوقَّع | عدد صحيح مُوَقَّع |
|---|---|---|
| آدا | modulo معامل النوع | raise Constraint_Error |
| لغة C ، لغة C++ | باقي القسمة على قوة العدد اثنين | سلوك غير محدد |
| سي شارب | يتم إجراء عملية حسابية على أساس القوة 2 في سياق غير مدقق؛ System.OverflowExceptionويتم طرحها في سياق مدقق [ 32 ] | |
| جافا | باقي القسمة على قوة العدد اثنين (char هو النوع الأولي الوحيد غير الموقع في جافا) | باقي القسمة على قوة العدد اثنين |
| جافا سكريبت | جميع الأرقام هي أرقام عشرية مزدوجة الدقة باستثناءBigInt | |
| MATLAB | تصل الأعداد الصحيحة المدمجة إلى حد التشبع. يمكن تهيئة الأعداد الصحيحة ذات الفاصلة الثابتة للالتفاف أو التشبع. | |
| بايثون 2 | غير متوفر | التحويل إلى longالنوع ( bigint) |
| مخطط | غير متوفر | التحويل إلىbigNum |
| سيمولينك | قابل للتكوين للتغليف أو التشبع | |
| أحاديث قصيرة | غير متوفر | التحويل إلىLargeInteger |
| سويفت | يُسبب خطأً ما لم يتم استخدام عوامل تجاوز السعة الخاصة. [ 33 ] | |
كشف
تتوفر آلية اكتشاف تجاوز السعة في وقت التشغيل UBSan( معقم السلوك غير المحدد ) لمترجمات لغة C.
في Java 8، توجد طرق محملة بشكل زائد ، على سبيل المثال Math.addExact(int, int)، والتي ستطلق استثناءً ArithmeticExceptionفي حالة تجاوز السعة.
قام فريق الاستجابة للطوارئ الحاسوبية (CERT) بتطوير نموذج الأعداد الصحيحة "كما لو كان ذا نطاق لانهائي" (AIR)، وهو آلية مؤتمتة إلى حد كبير للقضاء على تجاوز سعة الأعداد الصحيحة والاقتطاع في لغة C/C++ باستخدام معالجة الأخطاء في وقت التشغيل. [ 34 ]
تجنب
من خلال تخصيص متغيرات بأنواع بيانات كبيرة بما يكفي لاحتواء جميع القيم التي يمكن حسابها وتخزينها فيها، يُمكن تجنب تجاوز سعة التخزين. حتى عندما تكون المساحة المتاحة أو أنواع البيانات الثابتة التي توفرها لغة البرمجة أو بيئة العمل محدودة للغاية بحيث لا تسمح بتخصيص متغيرات بأحجام كبيرة بشكل وقائي، فإنه من خلال ترتيب العمليات بعناية والتحقق من المعاملات مسبقًا، يُمكن غالبًا ضمان ألا تتجاوز النتيجة حجم التخزين المتاح. يُمكن استخدام أدوات التحليل الثابت والتحقق الرسمي وتقنيات التصميم التعاقدي لضمان عدم حدوث تجاوز سعة التخزين عن طريق الخطأ بثقة أكبر وبشكل أكثر موثوقية.
التعامل
إذا كان من المتوقع حدوث تجاوز في سعة البيانات، فيمكن إدراج اختبارات في البرنامج لاكتشاف حدوثه أو قرب حدوثه، وإجراء عمليات أخرى للتخفيف من آثاره. على سبيل المثال، إذا تجاوزت نتيجة مهمة مُحسوبة من مُدخلات المستخدم سعة البيانات، فيمكن للبرنامج التوقف ورفض المُدخلات، وربما مطالبة المستخدم بإدخال بيانات مختلفة، بدلاً من أن يستمر البرنامج في العمل بالمُدخلات غير الصالحة التي تجاوزت السعة، مما قد يؤدي إلى خلل في الأداء.
تتمتع وحدات المعالجة المركزية عمومًا بآلية لاكتشاف ذلك لدعم جمع أعداد أكبر من حجم سجلاتها، وذلك عادةً باستخدام بت الحالة. تُسمى هذه التقنية بالحساب متعدد الدقة. وبالتالي، يُمكن إجراء عملية جمع على مستوى البايت لمعاملات أكبر من بايت واحد: أولًا، تُجمع البايتات الدنيا، ويُخزن الناتج، ويُتحقق من حدوث تجاوز؛ ثم تُجمع البايتات العليا، وإذا لزم الأمر، يُضاف الحمل من البايتات الدنيا، ثم يُخزن الناتج.
قد يتطلب التعامل مع احتمال حدوث تجاوز في عملية حسابية الاختيار بين إجراء فحص قبل العملية (لتحديد ما إذا كان التجاوز سيحدث أم لا)، أو بعد العملية (للنظر في احتمالية حدوثه بناءً على القيمة الناتجة). ولأن بعض التطبيقات قد تُولّد حالة اعتراض عند تجاوز عدد صحيح، فإن البرامج الأكثر قابلية للنقل تختبر قبل تنفيذ العملية التي قد تؤدي إلى التجاوز.
دعم لغات البرمجة
تُطبّق لغات البرمجة أساليب تخفيف متنوعة ضدّ تجاوز السعة العرضي: تُفعّل لغة آدا وبعض أنواع اللغات الوظيفية حالة استثناء عند تجاوز السعة، بينما تقوم لغة بايثون (منذ الإصدار 2.4) بتحويل التمثيل الداخلي للعدد بسلاسة ليتناسب مع نموه، وفي النهاية تمثيله على النحو التالي long- ولا يحدّ من قدرته سوى الذاكرة المتاحة. [ 35 ]
في اللغات التي تدعم العمليات الحسابية ذات الدقة العشوائية وأمان الأنواع (مثل بايثون ، وسمول توك ، وكومون ليسب )، تُرقّى الأرقام تلقائيًا إلى حجم أكبر عند حدوث تجاوزات، أو تُثار استثناءات (تُشير إلى الشروط) عند وجود قيد على النطاق. لذا، قد يكون استخدام هذه اللغات مفيدًا للتخفيف من هذه المشكلة. مع ذلك، في بعض هذه اللغات، لا تزال هناك حالات واردة لحدوث تجاوز في عدد صحيح. مثال على ذلك هو التحسين الصريح لمسار برمجي يعتبره محلل الأداء عنق زجاجة. في حالة كومون ليسب ، يُمكن تحقيق ذلك باستخدام تصريح صريح لتحديد نوع متغير إلى كلمة بحجم الآلة ( fixnum) [ 36 ] وخفض مستوى أمان الأنواع إلى الصفر [ 37 ] لكتلة برمجية معينة. [ 38 ] [ 39 ] [ 40 ] [ 41 ]
على النقيض تمامًا من اللغات القديمة مثل لغة C، توفر بعض اللغات الحديثة مثل Rust دوالًا مدمجة تُسهّل اكتشاف حالات تجاوز السعة وتمنح المستخدم حرية اختيار كيفية التعامل معها في كل حالة على حدة. في Rust، ورغم أن استخدام عوامل التشغيل الرياضية الأساسية يفتقر بطبيعته إلى هذه المرونة، إلا أنه يُمكن للمستخدمين إجراء العمليات الحسابية باستخدام مجموعة من الدوال التي توفرها كل نوع من أنواع البيانات العددية الأولية. تُتيح هذه الدوال للمستخدمين خيارات متعددة، منها إجراء عملية مُدققة (أو عملية تجاوز السعة ) (والتي تُشير إلى ما إذا كان تجاوز السعة قد حدث أم لا من خلال نوع القيمة المُعادة)؛ أو عملية "غير مُدققة"؛ أو عملية تُجري التفافًا؛ أو عملية تُجري تشبعًا عند الحدود العددية.
الحساب المشبع
في مجال رسومات الحاسوب أو معالجة الإشارات ، من الشائع التعامل مع بيانات تتراوح قيمها بين 0 و1 أو بين -1 و1. على سبيل المثال، لنأخذ صورة رمادية حيث يمثل 0 اللون الأسود، و1 يمثل اللون الأبيض، والقيم بينهما تمثل درجات الرمادي. إحدى العمليات التي قد نرغب في دعمها هي تفتيح الصورة بضرب كل بكسل في قيمة ثابتة. تسمح لنا العمليات الحسابية المشبعة بضرب كل بكسل في تلك القيمة الثابتة دون القلق من تجاوز الحد المسموح به، وذلك بالالتزام بنتيجة منطقية، وهي أن جميع البكسلات التي تزيد قيمتها عن 1 ( "أكثر سطوعًا من الأبيض" ) تصبح بيضاء، وجميع القيم "الأكثر قتامة من الأسود" تصبح سوداء.
أمثلة
يُعدّ تجاوز سعة العمليات الحسابية غير المتوقع سببًا شائعًا لأخطاء البرامج . وقد يصعب اكتشاف هذه الأخطاء وتشخيصها لأنها قد تظهر فقط مع مجموعات بيانات الإدخال الكبيرة جدًا، والتي من غير المرجح استخدامها في اختبارات التحقق.
يؤدي حساب المتوسط الحسابي لعددين عن طريق جمعهما وقسمتهما على اثنين، كما هو الحال في العديد من خوارزميات البحث ، إلى حدوث خطأ إذا كان المجموع (وليس المتوسط الناتج) كبيرًا جدًا بحيث لا يمكن تمثيله، وبالتالي يحدث تجاوز للسعة. [ 42 ]
بين عامي 1985 و1987، تسبب خلل في العمليات الحسابية في أجهزة العلاج الإشعاعي Therac-25 ، بالإضافة إلى نقص ضوابط السلامة في الأجهزة، في وفاة ستة أشخاص على الأقل بسبب جرعات زائدة من الإشعاع. [ 43 ]
كان خطأ حسابي غير معالج في برنامج توجيه المحرك السبب الرئيسي لتحطم الرحلة التجريبية الأولى لصاروخ أريان 5 عام 1996. [ 44 ] كان يُعتقد أن البرنامج خالٍ من الأخطاء نظرًا لاستخدامه في العديد من الرحلات السابقة، ولكن تلك الرحلات استخدمت صواريخ أصغر حجمًا تولد تسارعًا أقل من أريان 5. والمثير للإحباط أن الجزء من البرنامج الذي حدث فيه الخطأ لم يكن مطلوبًا تشغيله في أريان 5 وقت وقوع الحادث: فقد كان جزءًا من عملية إطلاق صاروخ أصغر حجمًا من أريان 5، وبقي هذا الجزء في البرنامج بعد تعديله للصاروخ الجديد. علاوة على ذلك، كان السبب الحقيقي للفشل خللًا في المواصفات الهندسية لكيفية تعامل البرنامج مع الخطأ عند اكتشافه: فقد أجرى البرنامج تفريغًا تشخيصيًا لبياناته، والذي كان من المفترض أن يكون متصلًا بمعدات الاختبار أثناء اختبار البرنامج خلال مرحلة التطوير، ولكنه كان متصلًا بمحركات توجيه الصاروخ أثناء الطيران. أدى تفريغ البيانات إلى دفع فوهة المحرك بقوة إلى جانب واحد، مما أدى إلى خروج الصاروخ عن السيطرة الديناميكية الهوائية وتسبب في تحطمه السريع في الجو. [ 45 ]

يحتوي برنامج Microsoft Macro Assembler الإصدار 1.00، وعلى الأرجح جميع البرامج الأخرى المبنية باستخدام نفس مُصرّف Pascal ، على خطأ في تجاوز سعة عدد صحيح وخطأ في الإشارة في كود إعداد المكدس، مما يمنعه من العمل على أجهزة MS-DOS الحديثة أو المحاكيات في بعض التكوينات الشائعة التي تحتوي على أكثر من 512 كيلوبايت من الذاكرة. يتوقف البرنامج عن العمل أو يعرض رسالة خطأ ثم يُغلق. [ 46 ]
في 30 أبريل 2015، أعلنت إدارة الطيران الفيدرالية الأمريكية أنها ستُصدر أمرًا لمشغلي طائرات بوينغ 787 بإعادة ضبط نظامها الكهربائي دوريًا، لتجنب حدوث تجاوز في عدد صحيح قد يؤدي إلى انقطاع التيار الكهربائي وتعطل توربينات الهواء الديناميكي ، وقامت بوينغ بنشر تحديث برمجي في الربع الأخير من العام. [ 47 ] وحذت وكالة سلامة الطيران الأوروبية حذوها في 4 مايو 2015. [ 48 ] يحدث الخطأ بعد 2.31 جزء من مئة من الثانية (حوالي 249 يومًا)، مما يشير إلى عدد صحيح مُوَقَّع من 32 بت .
في أغسطس/آب 2016، طبعت إحدى آلات الكازينو في منتجع وورلد تذكرة جائزة بقيمة 42,949,672.76 دولارًا أمريكيًا نتيجة خلل برمجي. رفض الكازينو دفع هذا المبلغ، معتبرًا ذلك عطلًا فنيًا، مستندًا في دفاعه إلى أن الآلة نصت بوضوح على أن الحد الأقصى للدفع هو 10,000 دولار أمريكي، وبالتالي فإن أي جائزة تتجاوز ذلك لا بد أن تكون نتيجة خلل برمجي. وقد أصدرت لجنة ألعاب ولاية نيويورك حكمًا لصالح الكازينو. [ 49 ]
ألعاب الفيديو
في لعبة سوبر ماريو بروس لجهاز نينتندو إنترتينمنت سيستم (NES) ، يُخزَّن عدد الأرواح كبايت مُوقَّع (يتراوح بين -128 و127)، ما يعني أن اللاعب يمكنه الاحتفاظ بـ 127 روحًا بأمان. ولكن عند وصول اللاعب إلى الروح 128، يعود عداد الأرواح إلى الصفر (مع أن العداد يتعطل قبل ذلك) ويتوقف عن العد. وبالتالي، إذا مات اللاعب بعد ذلك، تنتهي اللعبة فورًا. يعود سبب هذا إلى تجاوز سعة البيانات في اللعبة، وهو خطأ برمجي، إذ ربما لم يُقدِّر المطورون أن هذا العدد من الأرواح سيُكتسب بشكل معقول خلال جولة لعب كاملة.
في لعبة الفيديو "دونكي كونغ" (Donkey Kong) الشهيرة ، يستحيل تجاوز المستوى 22 بسبب خطأ في حساب الوقت/المكافأة. تُحدد اللعبة الوقت/المكافأة بضرب رقم المستوى الحالي في 10، ثم إضافة 40. عند الوصول إلى المستوى 22، يكون رقم الوقت/المكافأة 260، وهو رقم كبير جدًا بالنسبة لسجل القيمة 256 ذي 8 بت، مما يؤدي إلى تجاوز القيمة إلى 4، أي أقل من اللازم لإنهاء المستوى.
يُعدّ تجاوز سعة الذاكرة سببًا لظهور مستوى "الشاشة المنقسمة" في لعبة باك مان . [ 50 ] كما تسبب هذا الخطأ في ظهور منطقة " الأراضي البعيدة " في لعبة ماينكرافت جافا، والتي كانت موجودة منذ فترة تطوير Infdev وحتى الإصدار التجريبي 1.7.3؛ وقد تم إصلاحها لاحقًا في الإصدار التجريبي 1.8. وكان الخطأ نفسه موجودًا أيضًا في لعبة ماينكرافت بيدروك، ولكن تم إصلاحه منذ ذلك الحين. [ 51 ]
انظر أيضاً
- الحمل (الحسابي)
- الحساب النمطي
- غاندي النووي ، أسطورة حضرية مرتبطة بهذه الظاهرة
مراجع
- ↑ "بنية بايت .NET" .
- ↑ ".NET SByte Struct" .
- ↑ "حقل .NET SByte.MinValue" .
- ↑ "حقل .NET Byte.MinValue" .
- ↑ "حقل .NET SByte.MaxValue" .
- ↑ "حقل بايت.ماكس فيول" في .NET .
- ↑ ".NET Int16 Struct" .
- ↑ ".NET UInt16 Struct" .
- ↑ "حقل Int16.MinValue في .NET" .
- ^ "حقل .NET UInt16.MinValue" .
- ↑ "حقل Int16.MaxValue في .NET" .
- ↑ "حقل .NET UInt16.MaxValue" .
- ↑ ".NET Int32 Struct" .
- ↑ ".NET UInt32 Struct" .
- ↑ "حقل Int32.MinValue في .NET" .
- ↑ "حقل UInt32.MinValue في .NET" .
- ↑ "حقل Int32.MaxValue في .NET" .
- ↑ "حقل .NET UInt32.MaxValue" .
- ↑ ".NET Int64 Struct" .
- ↑ ".NET UInt64 Struct" .
- ↑ "حقل Int64.MinValue في .NET" .
- ↑ "حقل UInt64.MinValue في .NET" .
- ↑ "حقل Int64.MaxValue في .NET" .
- ↑ "حقل .NET UInt64.MaxValue" .
- ↑ ".NET Int128 Struct" .
- ↑ ".NET UInt128 Struct" .
- ↑ موظفو المنظمة الدولية للمقاييس. "ISO/IEC 9899:2011 تكنولوجيا المعلومات - لغات البرمجة - C" . ANSI.org .
- ↑ "التفاف عند تجاوز السعة - MATLAB و Simulink" . www.mathworks.com .
- ↑ "التشبع عند تجاوز السعة - MATLAB و Simulink" . www.mathworks.com .
- ↑ "CWE - CWE-191: تجاوز سعة عدد صحيح (التفاف أو التفاف حول) (3.1)" . cwe.mitre.org .
- ↑ "تعبيرات المعاملات - مرجع Rust" . Rust-lang.org . تم الاطلاع عليه بتاريخ 12 فبراير 2021 .
- ↑ بيل واغنر (8 أبريل 2023). "مُعَدَّ ومُعَدَّل (مرجع لغة سي شارب)" . msdn.microsoft.com .
- ↑ لغة البرمجة سويفت. إصدار سويفت 2.1. 21 أكتوبر 2015.
- ↑ نموذج الأعداد الصحيحة ذات المدى اللانهائي كما لو
- ↑ وثائق بايثون ، القسم 5.1 التحويلات الحسابية.
- ↑ " إعلان النوع " . مواصفات Common Lisp الفائقة .
- ↑ " إعلان التحسين " . مواصفات Common Lisp الفائقة .
- ↑ ريدي، أبيشيك (2008-08-22). "ميزات لغة Common Lisp" .
- ↑ بيرس، بنجامين سي. (2002). أنواع ولغات البرمجة . مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 0-262-16209-1.
- ↑ رايت، أندرو ك.؛ فيليسين، ماتياس (1994). "مقاربة نحوية لسلامة النوع" . المعلومات والحوسبة . 115 (1): 38-94 . doi : 10.1006/inco.1994.1093 .
- ↑ ماكراكيس، ستافروس (أبريل 1982). "السلامة والطاقة". ملاحظات هندسة البرمجيات ACM SIGSOFT . 7 (2): 25-26 . doi : 10.1145/1005937.1005941 . S2CID 10426644 .
- ↑ "خبر عاجل - اقرأ كل شيء عنه: جميع عمليات البحث الثنائي تقريبًا وفرز الدمج معطلة" . googleresearch.blogspot.co.uk . 2 يونيو 2006.
- ↑ بيهلر، باتريك (5 يوليو 2021). "عندما تتسبب أخطاء البرمجيات الصغيرة في مشاكل كبيرة" . مدونة غريو . تم الاطلاع عليه بتاريخ 16 يوليو 2023 .
- ↑ جليك، جيمس (1 ديسمبر 1996). "خلل وحادث تحطم" . صحيفة نيويورك تايمز . تم الاطلاع عليه بتاريخ 17 يناير 2019 .
- ↑ التقرير الرسمي عن حادثة فشل إطلاق صاروخ أريان 5.
- ↑ لينكلود، كريستوف (21 أبريل 2017). "تصحيح أخطاء برنامج IBM MACRO Assembler الإصدار 1.00" .
- ↑ معوض، جاد (30 أبريل 2015). "إدارة الطيران الفيدرالية تأمر بإصلاح مشكلة انقطاع الطاقة المحتمل في طائرة بوينغ 787" . صحيفة نيويورك تايمز .
- ↑ "US-2015-09-07: الطاقة الكهربائية - إيقاف التشغيل" . توجيهات صلاحية الطيران . الوكالة الأوروبية لسلامة الطيران . 4 مايو 2015.
- ↑ كرافتس، ديفيد (15 يونيو 2017). "معذرةً سيدتي، لم تربحي 43 مليون دولار - كان هناك "عطل" في ماكينة القمار"" . آرس تكنيكا .
- ↑ بيتمان، جيمي. "ملف باك مان" .
- ↑ "الأراضي البعيدة" . ويكي ماينكرافت . تم الاطلاع عليه بتاريخ 24 سبتمبر 2023 .
روابط خارجية
- Phrack #60، تجاوزات الأعداد الصحيحة الأساسية
- فراك رقم 60، حماية الأعداد الصحيحة ذات الحلقة الكبيرة
- الكشف الفعال والدقيق عن الهجمات القائمة على الأعداد الصحيحة
- تصنيف تهديدات WASC – تجاوزات الأعداد الصحيحة
- فهم تجاوز سعة الأعداد الصحيحة في لغة C/C++
- تجاوز السعة الثنائية – الحساب الثنائي
- معيار ISO C11
- أخطاء برمجية
- ثغرات أمنية في الحاسوب
- الحساب الحاسوبي
