Share via


CA2233: Las operaciones no deben desbordarse

Elemento Valor
RuleId CA2233
Category Microsoft.Usage
Cambio importante Poco problemático

Causa

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

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

No realice operaciones aritméticas sin validar primero los operandos para asegurarse de que el resultado de la operación no está fuera del intervalo de valores posibles para los tipos de datos implicados. Según el contexto de ejecución y los tipos de datos implicados, el desbordamiento aritmético puede dar lugar a System.OverflowException o a los bits más significativos del resultado descartado.

Cómo corregir infracciones

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

Cuándo suprimir las advertencias

Es seguro suprimir una advertencia de esta regla si los valores posibles de los operandos nunca harán que la operación aritmética se desborde.

Ejemplo de infracción

Un método del ejemplo siguiente manipula un entero que infringe esta regla. Visual Basic requiere que se deshabilite la opción Quitar desbordamiento de enteros para que esto se active.

using System; 

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

Si el método de este ejemplo supera a System.Int32.MinValue, la operación se subdesbordará. Esto hace que se descarte el bit más significativo del resultado. El siguiente código muestra cómo se produce esto.

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

Salida:

2147483647

Corrección con validación de parámetros de entrada

En el ejemplo siguiente se corrige la infracción anterior validando el valor de entrada.

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;        
        }    
    }
}

Corrección con un bloque comprobado

En el ejemplo siguiente se corrige la infracción anterior ajustando la operación en un bloque comprobado. Si la operación provoca un desbordamiento, se producirá una System.OverflowException.

Visual Basic no admite bloques comprobados.

using System; 

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

Activación del desbordamiento/subflujo aritmético comprobado

Si activa el desbordamiento o el subflujo aritmético comprobado en C#, equivale a encapsular cada operación de entero en un bloque comprobado.

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

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y, luego, elija Propiedades.

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

  3. Seleccione Buscar desbordamiento/subflujo aritmético y haga clic en Aceptar.

Vea también