Freigeben über


lnt-arithmetic-overflow

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

Siehe auch

IntelliSense-Codelinter für C++: Übersicht