تجاوز عدد صحيح هو مشكلة شائعة في البرمجة. في معظم لغات البرمجة، يتم تخزين القيم العددية الصحيحة في ذاكرة ذات طول ثابت. يمكن تقسيم الأعداد الصحيحة إلى أعداد غير سالبة وأعداد سالبة، والفرق يكمن في ما إذا كانت أعلى بت تستخدم كبت للتعبير عن السالب أو الموجب. على سبيل المثال، يمكن لذاكرة بحجم 32 بت تخزين أعداد صحيحة غير سالبة من 0 إلى 4,294,967,295 (uint32)، أو أعداد صحيحة سالبة من -2,147,483,648 إلى 2,147,483,647 (int32).
عندما تتجاوز نتائج الحساب النطاق الذي يمكن لنوع البيانات الصحيح تمثيله، يحدث تجاوز. معظم لغات البرمجة لا تتحقق من هذا الخطأ، بل تقوم بعمليات المود البسيطة أو تنتج سلوكًا غير معرف. قد يؤدي ذلك إلى نتائج غير متوقعة في تشغيل البرنامج. في عقود blockchain الذكية، وخاصة في مجال DeFi، تعتبر العمليات الحسابية الصحيحة شائعة جدًا، لذلك من الضروري الانتباه بشكل خاص إلى ثغرات تجاوز الأعداد الصحيحة.
تعريف تجاوز السعة العددية
تنقسم زيادة الأعداد الصحيحة إلى حالتين: زيادة ( overflow ) وانخفاض ( underflow ).
تجاوز الحد: نتيجة تتجاوز القيمة القصوى لنوع البيانات الصحيح. على سبيل المثال، 0xFFFFFFFF للuint32 عند إضافة 1 ستصبح 0x00000000.
تحت السقوط: النتيجة أقل من الحد الأدنى لنوع العدد الصحيح. على سبيل المثال، 0 من نوع uint32 ناقص 1 سيتحول إلى 0xFFFFFFFF.
!
تقنيات الحماية
في Rust يمكن اتخاذ التدابير التالية لمنع تجاوز سعة الأعداد الصحيحة:
قم بتكوين Cargo.toml لتمكين فحص تجاوزات الأعداد الصحيحة في وضع الإصدار:
من خلال هذه الطرق، يمكننا بشكل فعال منع ثغرات تجاوز السعة في عقود الذكاء Rust، وزيادة أمان العقد. عند كتابة عقود الذكاء التي تتضمن حسابات رياضية، من الضروري التعامل بحذر مع العمليات العددية واتخاذ تدابير الحماية المناسبة.
!
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تقنيات حماية من تجاوز الأعداد في العقود الذكية Rust
ثغرة تجاوز العدد الصحيح وطرق الحماية منها
تجاوز عدد صحيح هو مشكلة شائعة في البرمجة. في معظم لغات البرمجة، يتم تخزين القيم العددية الصحيحة في ذاكرة ذات طول ثابت. يمكن تقسيم الأعداد الصحيحة إلى أعداد غير سالبة وأعداد سالبة، والفرق يكمن في ما إذا كانت أعلى بت تستخدم كبت للتعبير عن السالب أو الموجب. على سبيل المثال، يمكن لذاكرة بحجم 32 بت تخزين أعداد صحيحة غير سالبة من 0 إلى 4,294,967,295 (uint32)، أو أعداد صحيحة سالبة من -2,147,483,648 إلى 2,147,483,647 (int32).
عندما تتجاوز نتائج الحساب النطاق الذي يمكن لنوع البيانات الصحيح تمثيله، يحدث تجاوز. معظم لغات البرمجة لا تتحقق من هذا الخطأ، بل تقوم بعمليات المود البسيطة أو تنتج سلوكًا غير معرف. قد يؤدي ذلك إلى نتائج غير متوقعة في تشغيل البرنامج. في عقود blockchain الذكية، وخاصة في مجال DeFi، تعتبر العمليات الحسابية الصحيحة شائعة جدًا، لذلك من الضروري الانتباه بشكل خاص إلى ثغرات تجاوز الأعداد الصحيحة.
تعريف تجاوز السعة العددية
تنقسم زيادة الأعداد الصحيحة إلى حالتين: زيادة ( overflow ) وانخفاض ( underflow ).
تجاوز الحد: نتيجة تتجاوز القيمة القصوى لنوع البيانات الصحيح. على سبيل المثال، 0xFFFFFFFF للuint32 عند إضافة 1 ستصبح 0x00000000.
تحت السقوط: النتيجة أقل من الحد الأدنى لنوع العدد الصحيح. على سبيل المثال، 0 من نوع uint32 ناقص 1 سيتحول إلى 0xFFFFFFFF.
!
تقنيات الحماية
في Rust يمكن اتخاذ التدابير التالية لمنع تجاوز سعة الأعداد الصحيحة:
تومل [الملف الشخصي.الإصدار] فحوصات تجاوز الفائض = صحيح panic = 'إلغاء'
صدأ استخدم uint::construct_uint;
construct_uint! { بنية الحانة U1024(16) ؛ }
صدأ دع النتيجة = x.checked_add(y).expect("تجاوز الإضافة");
صدأ دع amount_u256 = U256 ::from(u128::MAX) + 1 ؛ دع amount_u128 = amount_u256.as_u128(); سيؤدي إلى الذعر
!
من خلال هذه الطرق، يمكننا بشكل فعال منع ثغرات تجاوز السعة في عقود الذكاء Rust، وزيادة أمان العقد. عند كتابة عقود الذكاء التي تتضمن حسابات رياضية، من الضروري التعامل بحذر مع العمليات العددية واتخاذ تدابير الحماية المناسبة.
!