Compartilhar via


CA2233: as operações não devem estourar

TypeName

OperationsShouldNotOverflow

CheckId

CA2233

Categoria

Microsoft.Usage

Alteração Significativa

Sem Quebra

Causa

Um método realiza uma operação aritmética e não valida os operandos com antecedência para evitar estouro.

Descrição da Regra

Operações aritméticas não devem ser executadas sem primeiro validar os operandos para garantir que o resultado da operação não está fora do intervalo de valores possíveis para os tipos de dados envolvidos.Dependendo do contexto de execução e os tipos de dados envolvidos, o estouro aritmético pode resultar em OverflowException ou a bit mais significativo de resultado descartado.

Como Corrigir Violações

Para corrigir uma violação desta regra, valide os operandos antes de executar a operação.

Quando Suprimir Alertas

É seguro suprimir um aviso dessa regra se os valores possíveis dos operandos nunca causam a operação aritmética estouro.

Exemplo de uma Violação

Descrição

Um método no exemplo manipula um inteiro que viola esta regra.Visual Basic requer a opção de estouro de inteiro de Remover ser desabilitado para que esse seja acionado.

Código

Imports System 

Public Module Calculator     

    Public Function Decrement(ByVal input As Integer) As Integer 

        ' Violates this rule        
        input = input - 1         
        Return input

    End Function  

End Module
using System; 

namespace Samples
{    
    public static class Calculator    
    {        
        public static int Decrement(int input)        
        {             
            // Violates this rule            
            input--;             
            return input;        
        }    
    }
}

Comentários

Se o método neste exemplo é MinValuepassado, a operação estouro negativo.Isso faz com que o bit mais significativo de resultado a ser descartado.As seguintes do código mostra como isso ocorre.

[C#]

public static void Main()
{
    int value = int.MinValue;    // int.MinValue is -2147483648 
    value = Calculator.Decrement(value); 
    Console.WriteLine(value);
}

[VB]

Public Shared Sub Main()     
    Dim value = Integer.MinValue    ' Integer.MinValue is -2147483648 
    value = Calculator.Decrement(value) 
    Console.WriteLine(value) 
End Sub

Saída

2147483647

Correção com validação de parâmetro de entrada

Descrição

O exemplo a seguir corrige a violação anterior validando o valor de entrada.

Código

Public Module Calculator

    Public Function Decrement(ByVal input As Integer) As Integer 

        If (input = Integer.MinValue) Then _
            Throw New ArgumentOutOfRangeException("input", "input must be greater than Int32.MinValue")

        input = input - 1
        Return input

    End Function 

End Module
using System; 

namespace Samples
{    
    public static class Calculator    
    {        
        public static int Decrement(int input)        
        {            
            if (input == int.MinValue)                
                throw new ArgumentOutOfRangeException("input", "input must be greater than Int32.MinValue");

            input--;             
            return input;        
        }    
    }
}

Correção com um bloco verificado

Descrição

O exemplo a seguir corrige a violação anterior envolvendo a operação em um bloco verificado.Se a operação faz com que um estouro, OverflowException será gerado.

Observe que os blocos verificados não tenham suporte em Visual Basic.

Código

using System; 

namespace Samples
{    
    public static class Calculator    
    {        
        public static int Decrement(int input)        
        {            
            checked            
            {                
                input--;            
            }                        

            return input;        
        }    
    }
}

Ativar o estouro aritmético/estouro negativo verificados

Se você ativar o estouro aritmético/estouro negativo verificados no C#, é equivalente a envolver cada operação de inteiro em um bloco verificado.

Para ativar verificado que o estouro aritmético/estouro negativo em C#

  1. Em Gerenciador de Soluções, clique com o botão direito do mouse no projeto e escolha Propriedades.

  2. Selecione a guia de Compilar e clique em Avançado.

  3. Verificar o estouro aritmético/estouro negativo Selecione e clique em OK.

Consulte também

Referência

Operadores em C#

Contexto verificado e não verificado (Referência de C#)

OverflowException