Compartilhar via


As operações não devem estouro

TypeName

OperationsShouldNotOverflow

CheckId

CA2233

Category (Categoria)

Microsoft.uso

Quebrando alterar

Não separável

Causa

Um método executa uma operação aritmética e não validar 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 se certificar de que o resultado da operação não está fora do intervalo dos valores possíveis para os tipos de dados envolvidos.Dependendo do contexto de execução e os tipos de dados envolvidos, estouro aritmético pode resultar em um um System.OverflowException ou os bits mais significativos do resultado descartado.

Como corrigir violações

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

Quando suprimir avisos

É seguro eliminar um aviso essa regra se os valores possíveis dos operandos nunca irão fazer 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 violam essa regra.Visual Basic requer o Remover inteiro estouro opção a ser desabilitado 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 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

Saída

2147483647

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

Descrição

O exemplo a seguir corrige a violação anterior ao validar 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 selecionado

Descrição

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

Observe que o check-blocos não são suportados em Visual Basic.

Código

using System; 

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

            return input;        
        }    
    }
}

Ativar verificação estouro aritmético/estouro negativo

Se você ativar marcados estouro aritmético / estouro negativo em translation from VPE for Csharp, é equivalente a quebra automática de cada operação inteiro em um bloco selecionado.

Para ativar o check-estouro/estouro de negativo aritmético em translation from VPE for Csharp

  1. In O gerenciador de soluções, clicar com o botão direito do mouse em seu projeto e escolher Propriedades.

  2. selecionar o Compilação guia e clicar Avançado.

  3. selecionar Verificar Estouro Aritmético/Estouro negativo e clicar OK.

Consulte também

Referência

Operadores C#

Verificado Desmarcado (referência do e do C#)

System.OverflowException