Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein arithmetischer Ausdruck kann einen Überlauf verursachen, bevor er in einen breiteren Typ konvertiert wird.
In C und C++ werden arithmetische Operationen mit dem breitesten Typ der Operanden ausgewertet, nicht mit der Breite des Typs, dem das Ergebnis zugewiesen ist. Wenn ein Ergebnis in einen breiteren Typ konvertiert wird, gibt dies an, dass der Entwickler erwartet, dass der Vorgang einen Überlauf der schmaleren Typen der Operanden verursachen kann.
Die Überprüfung lnt-arithmetic-overflow
wird von der Einstellung Arithmetischer Überlauf in den C/C++-Codestiloptionen gesteuert. Weitere Informationen zum Ändern dieser Einstellung finden Sie unter Konfigurieren des Linters.
Beispiele
#include <cstdint>
void overflow(int a, int b) {
int64_t mul = a * b; // Flagged: 32-bit operation may overflow.
int64_t shift = a << 34; // Flagged: Shift would overflow.
int64_t mul2 = mul + b; // OK: 'mul' is 64-bit so the addition expression is
// evaluated using 64-bit operations.
}
Beheben dieses Problems
Die vom Linter vorgeschlagene Lösung besteht darin, einen der Operanden auszuweiten. Anschließend wird der gesamte Ausdruck mit dem breiteren Ereignistyp ausgewertet, wie in diesem Beispiel gezeigt:
void overflow(int a, int b) {
int64_t mul = static_cast<int64_t>(a) * b;
int64_t shift = static_cast<int64_t>(a) << 34;
}