Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Арифметическое выражение может переполниться перед преобразованием в более широкий тип.
В 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;
}