Поделиться через


lnt-arithmetic-overflow

Арифметическое выражение может переполниться перед преобразованием в более широкий тип.

В C и C++ арифметические операции оцениваются с использованием самого широкого типа операндов, а не ширины типа, которому назначен результат. Когда результат преобразуется в более широкий тип, он указывает, что операция могла переполнить более узкие типы операндов.

Проверка lnt-arithmetic-overflow контролируется настройкой Арифметическое переполнение в параметрах стиля кода C/C++. Сведения о том, как изменить этот параметр, см. в разделе Настройка анализатора кода.

Примеры

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

Как устранить проблему

Исправление, предлагаемое анализатором кода, — явно расширить один из операндов. Затем все выражение вычисляется в более широком типе результата, как показано в следующем примере:

void overflow(int a, int b) {
    int64_t mul = static_cast<int64_t>(a) * b;
    int64_t shift = static_cast<int64_t>(a) << 34;
}

См. также

Обзор анализатора кода IntelliSense для C++