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#:
En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y, luego, elija Propiedades.
Seleccione la pestaña Compilar y haga clic en Opciones avanzadas.
Seleccione Buscar desbordamiento/subflujo aritmético y haga clic en Aceptar.
Vea también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de