Frage

Was ist die effektivste Praxis zu verhindern arithmetischer Überlauf und Unterfluss?

Einige Beispiele, die mir in den Sinn kommen, sind:

  • Tests basierend auf gültigen Eingabebereichen
  • Validierung mit formalen Methoden
  • Verwendung von Invarianten
  • Erkennung zur Laufzeit mit Sprachfunktionen oder Bibliotheken (dies verhindert nicht)
War es hilfreich?

Lösung

Eine Möglichkeit besteht darin, eine Sprache zu verwenden, die willkürlich Ganzzahlen betrifft, die niemals überlaufen / unterlaufen.

Andernfalls, wenn dies etwas ist, worüber Sie sich wirklich Sorgen machen, und wenn Ihre Sprache dies erlaubt, schreiben Sie eine Wrapper -Klasse, die wie eine Ganzzahl wirkt, aber jede Operation über Überlauf überprüft. Sie könnten sogar den Überblick über Debug -Builds durchführen und die Dinge für Release -Builds optimiert lassen. In einer Sprache wie C ++ könnten Sie dies tun, und es würde sich fast genau wie eine Ganzzahl für Release-Builds verhalten, aber für Debug-Builds würden Sie die volle Laufzeit überprüfen.

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...
};

Bearbeiten:

Es stellt sich heraus, dass jemand ist Tun Sie dies bereits für C ++ - Die aktuelle Implementierung konzentriert sich auf Visual Studio, aber es sieht so aus, als würde sie auch GCC unterstützen.

Andere Tipps

Ich schreibe viel Testcode, um den Bereich der Bereiche/Gültigkeit auf meinen Code durchzuführen. Dies neigt dazu, die meisten dieser Arten von Situationen zu fangen - und hilft mir definitiv, mehr kugelsicheres Code zu schreiben.

Verwenden Sie hohe Präzisionsschwimmpunktzahlen wie a langes Doppel.

Ich denke, Sie vermissen eine sehr wichtige Option in Ihrer Liste: Wählen Sie die richtige Programmiersprache für den Job. Es gibt viele Programmiersprachen, die diese Probleme nicht haben, da sie keine Ganzzahlen für feste Größe haben.

Es gibt wichtigere Überlegungen bei der Auswahl, welche Sprache Sie verwenden, als die Größe der Ganzzahl. Überprüfen Sie einfach Ihre Eingabe, wenn Sie nicht wissen, ob der Wert in Grenzen liegt, oder verwenden Sie die Ausnahmebehandlung, wenn der Fall äußerst selten ist.

Ein Wrapper, der nach Inkonsistenzen prüft, wird in vielen Fällen sinnvoll sein. Wenn ein additiver Operation (dh, Addition oder Multiplikation) bei zwei oder mehr Ganzzahlen einen kleineren Wert als die Operanden führt, wissen Sie, dass etwas schief gelaufen ist. Jede additive Operation sollte folgen,

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

Ebenso sollte jede Operation, die logisch zu einem kleineren Wert führen sollte, prüfen, ob sie versehentlich verankert wurden.

Haben Sie die Verwendung formeller Methoden untersucht, um Ihren Code zu überprüfen, um zu beweisen, dass er frei von Überläufen ist? Eine als abstrakte Interpretation bekannte formale Methodentechnik kann die Robustheit Ihrer Software überprüfen, um zu beweisen, dass Ihre Software nicht unter einem Überlauf, Unterströmung, Teilen durch Null, Überlauf oder ähnlichen Laufzeitfehler litt. Es ist eine mathematische Technik, die Ihre Software umfassend analysiert. Die Technik wurde in den 1970er Jahren von Patrick Cousot Pionierarbeiter. Es wurde erfolgreich verwendet, um eine Überlaufbedingung in der Arian 5 -Rakete zu diagnostizieren, bei der ein Überlauf die Zerstörung des Trägerfahrzeugs verursachte. Der Überlauf wurde bei der Umwandlung einer schwimmenden Punktzahl in eine Ganzzahl verursacht. Weitere Informationen zu dieser Technik finden Sie weiter hier und auch weiter Wikipedia.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top