Compartir a través de


CA2233: Las operaciones no deben desbordarse

Nombre de tipo

OperationsShouldNotOverflow

Identificador de comprobación

CA2233

Categoría

Microsoft.Usage

Cambio problemático

No

Motivo

Un método realiza una operación aritmética y no valida de antemano los operandos para evitar el desbordamiento.

Descripción de la regla

Las operaciones aritméticas no deberían realizarse sin validar primero los operandos para asegurase de que el resultado de la operación no se encuentra fuera del intervalo de valores posible de los tipos de datos que se utilicen.Según la ejecución del contexto y los tipos de datos que se van a utilizar, el desbordamiento aritmético puede provocar una System.OverflowException o que se descarten los bits más significativos del resultado.

Cómo corregir infracciones

Para corregir una infracción de esta regla, valide los operandos antes de realizar la operación.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla si los valores posibles de los operandos nunca provocasen el desbordamiento de la operación matemática.

Ejemplo de infracción

ms182354.collapse_all(es-es,VS.110).gifDescripción

Un método del siguiente ejemplo manipula un entero que infringe esta regla.Visual Basic exige que la opción Quitar desbordamiento de enteros esté deshabilitada para que esto desencadene.

ms182354.collapse_all(es-es,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(es-es,VS.110).gifComentarios

Si se pasa al método de este ejemplo MinValue, la operación sufriría un subdesbordamiento.Esto produce el bit más significativo del resultado que se va a descartar.El código siguiente muestra cómo se produce esto.

[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(es-es,VS.110).gifOutput

2147483647

Corregir con validación del parámetro de entrada

ms182354.collapse_all(es-es,VS.110).gifDescripción

En el ejemplo siguiente se corrige la infracción anterior mediante la validación del valor de entrada.

ms182354.collapse_all(es-es,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;        
        }    
    }
}

Corregir con un bloque comprobado

ms182354.collapse_all(es-es,VS.110).gifDescripción

En el ejemplo siguiente se corrige la infracción anterior mediante el ajuste de la operación en un bloque comprobado.Si la operación produce un desbordamiento, se producirá System.OverflowException.

Observe que los bloques comprobados no se admiten en Visual Basic.

ms182354.collapse_all(es-es,VS.110).gifCódigo

using System; 

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

            return input;        
        }    
    }
}

Activar el desbordamiento/subdesbordamiento aritmético comprobado

Si activa el desbordamiento/subdesbordamiento aritmético comprobado en C#, será equivalente a ajustar cada operación de enteros en un bloque comprobado.

Para activar el desbordamiento/subdesbordamiento aritmético comprobado en C#

  1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto y elija Propiedades.

  2. Seleccione la pestaña Compilar y haga clic en Avanzadas.

  3. Seleccione Comprobar el desbordamiento y subdesbordamiento aritmético y haga clic en Aceptar.

Vea también

Referencia

operadores de C#

Checked y Unchecked (Referencia de C#)

System.OverflowException