2008-09-17 7 views

Antwort

3

Eine Möglichkeit ist, eine Sprache zu verwenden, die beliebig si hat zed Ganzzahlen, die niemals über-/unterlaufen.

Andernfalls sollten Sie sich wirklich Sorgen machen, und wenn Ihre Sprache dies zulässt, schreiben Sie eine Wrapper-Klasse, die sich wie eine Ganzzahl verhält, aber jede Operation auf Überlauf prüft. Sie könnten sogar die Überprüfung von Debug-Builds durchführen lassen 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 ein Integer für Release-Builds verhalten, aber für Debug-Builds würden Sie eine vollständige Laufzeitprüfung erhalten.

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

Edit:

Stellt sich heraus, jemand ist doing this already for C++ - die aktuelle Implementierung für Visual Studio konzentriert, aber es sieht aus wie sie Unterstützung auch für gcc zu bekommen.

1

Ich schreibe eine Menge Testcode, um die Bereichs-/Gültigkeitsprüfung für meinen Code durchzuführen. Dies neigt dazu, die meisten dieser Arten von Situationen zu erfassen - und hilft mir definitiv, mehr kugelsicheren Code zu schreiben.

1

Verwenden Sie hochpräzise Gleitkommazahlen wie long double.

+0

Fließkomma (mit jeder Genauigkeit) führt eine noch härtere Klasse von Problemen ein, nämlich den Verlust der Genauigkeit. I.e. '(x + 1.0) -x! = 1'. Die Verwendung von "long double" reduziert lediglich die Frequenz und die Größe. – MSalters

1

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

0

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

0

Ein Wrapper, der auf Inkonsistenzen prüft, ist in vielen Fällen sinnvoll. Wenn eine additive Operation (dh Addition oder Multiplikation) auf zwei oder mehr Ganzzahlen zu einem kleineren Wert führt als die Operanden, dann weiß man, dass etwas schief gelaufen ist. Jeder Zusatzstoff Operation sollte durch, gefolgt

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

Ebenso jede Operation, die in einem kleineren Wert logisch führen sollte sollte zu sehen sein überprüfen, ob es versehentlich embiggin'd.

0

Haben Sie die Verwendung von formalen Methoden untersucht, um zu überprüfen, ob Ihr Code frei von Überläufen ist? Eine formale Verfahrenstechnik, die als abstrakte Interpretation bekannt ist, kann die Robustheit Ihrer Software überprüfen, um zu beweisen, dass Ihre Software nicht unter einem Überlauf, Unterlauf, Division durch Null, Überlauf oder anderen ähnlichen Laufzeitfehlern leidet. Es ist eine mathematische Technik, die Ihre Software erschöpfend analysiert. Die Technik wurde von Patrick Cousot in den 1970er Jahren entwickelt.Es wurde erfolgreich verwendet, um einen Überlaufzustand in der Arian 5-Rakete zu diagnostizieren, bei dem ein Überlauf die Zerstörung der Trägerrakete verursachte. Der Überlauf wurde beim Konvertieren einer Gleitkommazahl in eine ganze Zahl verursacht. Sie können weitere Informationen über diese Technik finden here und auch auf Wikipedia.