Compartilhar via


CA2233: As operações não devem estouro.

TypeName

OperationsShouldNotOverflow

CheckId

CA2233

<strong>Categoria</strong>

Microsoft.Usage

Alteração significativa

Não separável

Causa

Um método executa uma operação aritmética e não valida os operandos antecipadamente para impedir o estouro.

Descrição da regra

Operações aritméticas não devem ser executadas sem primeiro validar os operandos para certificar-se de 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 um um System.OverflowException ou os bits mais significativos do resultado descartadas.

Como corrigir violações

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

Quando suprimir avisos

É seguro eliminar um aviso esta regra se os valores possíveis dos operandos nunca fará com que a operação aritmética de estouro.

Exemplo de uma violação.

Descrição

Um método no exemplo a seguir manipula um número inteiro que viola essa regra. Visual Basicrequer o Remover opção de estouro de inteiro ser desabilitada para que isso 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 é passado MinValue, a operação seria negativo. Isso faz com que o bit mais significativo do resultado sejam descartados. O código a seguir 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

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

Descrição

O exemplo a seguir corrige a violação anterior, validando o valor da 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;        
        }    
    }
}

Corrigir com um bloco marcado

Descrição

O exemplo a seguir corrige a violação anterior encapsulando a operação em um bloco marcado. Se a operação faz com que uma área de excedentes, um System.OverflowException será lançada.

Observe que os blocos marcados não são suportados no Visual Basic.

Código

using System; 

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

            return input;        
        }    
    }
}

Ativar Checked estouro aritmético/estouro negativo

Se você ativar checked aritmético estouro/estouro negativo em C#, é equivalente à disposição de cada operação de inteiro em um bloco marcado.

Para ativar checked aritmético estouro/estouro negativo em C#

  1. Em Solution Explorer, seu projeto com o botão direito e escolha Propriedades.

  2. Selecione o Build guia e clique em Advanced.

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

Consulte também

Referência

C# Operators

Selecionado e desmarcada (C# referência)

System.OverflowException