Aviso C26451

Estouro aritmético: usando o operador 'operator' em um valor de bytes de tamanho a e, em seguida, convertendo o resultado em um valor de byte tamanho b. Converta o valor para o tipo mais amplo antes de chamar o operador 'operator' para evitar estouro (io.2)

Esse aviso indica um comportamento incorreto que resulta de regras de promoção integrais e tipos maiores do que aqueles em que a aritmética normalmente é executada.

Comentários

A análise de código detecta quando um valor integral é deslocado para a esquerda, multiplicado, adicionado ou subtraído e o resultado é convertido em um tipo integral mais amplo. Se a operação estourar o tipo integral mais estreito, os dados serão perdidos. Você pode evitar essa perda convertendo o valor em um tipo mais amplo antes da operação aritmética.

Nome da análise de código: RESULT_OF_ARITHMETIC_OPERATION_CAST_TO_LARGER_SIZE

Exemplos

O seguinte código gera esse aviso:

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

  // code
}

Para corrigir esse aviso, use o seguinte código:

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

  // code
}

Confira também

C26450
C26452
C26453
C26454
ES.103: não estourar