Предупреждение C26451

Арифметический переполнение: использование оператора "operator" в значении размера байта, а затем приведение результата к значению байта size-b. Приведение значения к более широкому типу перед вызовом оператора "оператор" для предотвращения переполнения (io.2)

Это предупреждение указывает на неправильное поведение, которое приводит к целочисленным правилам и типам, превышающим арифметические действия, которые обычно выполняются.

Замечания

Анализ кода определяет, когда целочисленное значение перемещается влево, умножается, добавляется или вычитается, а результат получает приведение к более широкому целочисленного типа. Если операция переполняет более узкий целочисленный тип, данные теряются. Эту потерю можно предотвратить, приведения значения к более широкому типу перед арифметической операцией.

Имя анализа кода: RESULT_OF_ARITHMETIC_OPERATION_CAST_TO_LARGER_SIZE

Примеры

Следующий код создает это предупреждение:

void leftshift(int i) noexcept
{
  unsigned long long x;
  x = i << 31;  // C26451 reported here

  // code
}

Чтобы исправить это предупреждение, используйте следующий код:

void leftshift(int i) noexcept
{
  unsigned long long x;
  x = static_cast<unsigned long long>(i) << 31; // OK

  // code
}

См. также

26450
26452
26453
26454
ES.103: не переполнение