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 com antecedência para evitar um 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 de estouro aritmética.

Exemplo de uma violação

ms182354.collapse_all(pt-br,VS.110).gifDescriçã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 a ser desativado para que isso seja acionado.

ms182354.collapse_all(pt-br,VS.110).gifCó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;        
        }    
    }
}

ms182354.collapse_all(pt-br,VS.110).gifComentários

Se o método neste exemplo é passado MinValue, a operação seria estouro 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

ms182354.collapse_all(pt-br,VS.110).gifSaída

2147483647

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

ms182354.collapse_all(pt-br,VS.110).gifDescrição

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

ms182354.collapse_all(pt-br,VS.110).gifCó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

ms182354.collapse_all(pt-br,VS.110).gifDescriçã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.

ms182354.collapse_all(pt-br,VS.110).gifCó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 o check-estouro/estouro de negativo aritmético 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

Operadores de C#

Marcada e desmarcada (C# Reference)

System.OverflowException