الممارسة الوحيدة الأكثر فعالية لمنع التجاوز الحسابي والتجاوز

StackOverflow https://stackoverflow.com/questions/78913

سؤال

ما هي الممارسة الوحيدة الأكثر فعالية لمنع الفائض الحسابي و التدفق السفلي?

بعض الأمثلة التي تتبادر إلى الذهن هي:

  • الاختبار بناءً على نطاقات الإدخال الصالحة
  • التحقق باستخدام الطرق الرسمية
  • استخدام الثوابت
  • الكشف في وقت التشغيل باستخدام ميزات اللغة أو المكتبات (وهذا لا يمنع ذلك)
هل كانت مفيدة؟

المحلول

أحد الاحتمالات هو استخدام لغة تحتوي على أعداد صحيحة ذات حجم عشوائي لا تتجاوز حجمها/تتجاوز حجمها أبدًا.

بخلاف ذلك، إذا كان هذا أمرًا يثير اهتمامك حقًا، وإذا كانت لغتك تسمح بذلك، فاكتب فئة مجمعة تعمل كعدد صحيح، ولكنها تتحقق من تجاوز السعة في كل عملية.يمكنك أيضًا أن تجعله يقوم بالتحقق من إصدارات تصحيح الأخطاء، ويترك الأشياء محسنة لإصدارات الإصدار.في لغة مثل C++، يمكنك القيام بذلك، وسوف يتصرف تمامًا مثل عدد صحيح لإصدارات الإصدار، ولكن بالنسبة لإصدارات تصحيح الأخطاء، فستحصل على فحص كامل لوقت التشغيل.

class CheckedInt
{
private: 
    int Value;

public:
    // Constructor
    CheckedInt(int src) : Value(src) {}

    // Conversions back to int
    operator int&() { return Value; }
    operator const int &() const { return Value; }

    // Operators
    CheckedInt operator+(CheckedInt rhs) const
    {
        if (rhs.Value < 0 && rhs.Value + Value > Value)
            throw OverflowException();
        if (rhs.Value > 0 && rhs.Value + Value < Value)
            throw OverflowException();
        return CheckedInt(rhs.Value + Value);
    }

    // Lots more operators...
};

يحرر:

تبين أن هناك شخص ما القيام بذلك بالفعل لـ C++ - يركز التطبيق الحالي على Visual Studio، ولكن يبدو أنهم يحصلون على دعم لـ gcc أيضًا.

نصائح أخرى

أكتب الكثير من أكواد الاختبار لإجراء فحص النطاق/الصلاحية على الكود الخاص بي.يميل هذا إلى اكتشاف معظم هذه الأنواع من المواقف - ويساعدني بالتأكيد في كتابة المزيد من التعليمات البرمجية المضادة للرصاص.

استخدم أرقام الفاصلة العائمة عالية الدقة مثل مزدوج طويل.

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

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

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

if (sum < operand1 || sum < operand2)
    omg_error();

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

هل بحثت في استخدام الأساليب الرسمية للتحقق من التعليمات البرمجية الخاصة بك لإثبات خلوها من التجاوزات؟يمكن لتقنية الطرق الرسمية المعروفة باسم التفسير المجرد التحقق من قوة برنامجك لإثبات أن برنامجك لن يعاني من تجاوز السعة، أو التجاوز، أو القسمة على صفر، أو التجاوز، أو أي خطأ آخر مماثل في وقت التشغيل.إنها تقنية رياضية تقوم بتحليل برنامجك بشكل شامل.كان باتريك كوزوت رائدًا في هذه التقنية في السبعينيات.وقد تم استخدامه بنجاح لتشخيص حالة الفائض في صاروخ أريان 5 حيث تسبب الفائض في تدمير مركبة الإطلاق.حدث تجاوز السعة أثناء تحويل رقم الفاصلة العائمة إلى عدد صحيح.يمكنك العثور على مزيد من المعلومات حول هذه التقنية هنا وأيضا على ويكيبيديا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top