CA2233: Las operaciones no deben desbordarse
TypeName |
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 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
Descripció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.
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;
}
}
}
Comentarios
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
Resultados
2147483647
Corregir con validación del parámetro de entrada
Descripción
En el ejemplo siguiente se corrige la infracción anterior mediante la validación del valor de 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;
}
}
}
Corregir con un bloque comprobado
Descripció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á OverflowException.
Observe que los bloques comprobados no se admiten en Visual Basic.
Có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#
En el Explorador de soluciones, haga clic con el botón secundario del mouse en el proyecto y elija Propiedades.
Seleccione la pestaña Compilar y haga clic en Avanzadas.
Seleccione Comprobar el desbordamiento y subdesbordamiento aritmético y haga clic en Aceptar.