2012-06-02 12 views
6

Mögliche Duplizieren:
Best way to detect integer overflow in C/C++automatische Überlauferkennung in C++?

Oft, wenn ich etwas in C++ mit großen Zahlen codiert haben kann ich nicht sagen, wenn ein Überlauf auftritt, auch wenn ich so etwas wie ein bin mit langer langer oder anderer 64-Bit-Datentyp. Gibt es einen effektiven Weg, um zu erkennen, wenn ein Überlauf auftritt, anstatt fehlerhafte Werte zu sehen?

+1

Stattdessen roh ganzzahlige Werte zu verwenden, Sie Objekte mit überladenen arithmetischen Operatoren, die Ausnahmen nutzen könnten, wenn ein Überlauf auftritt werfen. – jamesdlin

+2

Was ist die Operation, die Sie auf den Zahlen machen? – Baget

+0

@Baget könnte alles sein. Addition, Subtraktion, Multiplikation, Exponent, usw. hängt vom Programm ab. –

Antwort

2

Es kann nicht viel sein, dass Sie von Standard-C++ erhalten würden:

5 Expressions

Wenn bei der Auswertung eines Ausdrucks, ist das Ergebnis nicht mathematisch definiert oder nicht im Bereich der darstellbaren Werte für sein Typ ist das Verhalten nicht definiert. [Hinweis: Die meisten vorhandenen Implementierungen von C++ ignorieren Integer-Überläufe. Die Behandlung der Division durch Null, Bilden eines Rests unter Verwendung eines Nulldivisors und alle floatenden Punktausnahmen variieren zwischen den Maschinen und sind normalerweise durch eine Bibliotheksfunktion einstellbar. -Ende note]

Ihre beste Wette ist, um wahrscheinlich den Standard fester Breite Integer-Typen in <cstdint> wie uint32_t definiert zu verwenden.

Werfen Sie einen Blick auf die <cerrno> Header für Fehlercodes wie EOVERFLOW. Es gibt dann die overflow_error/underflow_error Klassen von <stdexcept>.

+0

EOVERFLOW kann durch Bibliotheksfunktionen festgelegt werden, aber nicht durch arithmetische Operationen. –

1

Tatsächlich können Sie einen Überlauf nicht einmal zuverlässig erkennen, da ein Überlauf in vorzeichenbehafteten ganzzahligen Operationen zu undefiniertem Verhalten führt. Wenn der Compiler erkennt, dass ein Code-Pfad nur im Falle eines Überlaufs erreicht wird, darf er ihn vollständig optimieren (da er im undefinierten Verhalten alles tun kann). Vorzeichenlose Typen unterscheiden sich darin, dass sie Überlaufeigenschaften definiert haben (sie führen die Modularithmetik durch).

Die einzige Möglichkeit, einen Überlauf bei Typen mit Vorzeichen zu erkennen, besteht darin, vorher die entsprechende Prüfung durchzuführen, was ziemlich teuer ist. Es ist fast immer viel effizienter, Dinge so zu konstruieren, dass eine Invariante Ihres Algorithmus sicherstellt, dass es keinen Überlauf geben kann.

Was Ressourcen auf den möglichen Überlauf erkennen, bevor es geschieht, siehe https://stackoverflow.com/a/199413/445525

Verwandte Themen