CA2233 : Les opérations ne doivent pas déborder
TypeName |
OperationsShouldNotOverflow |
CheckId |
CA2233 |
Catégorie |
Microsoft.Usage |
Modification avec rupture |
Modification sans rupture |
Cause
Une méthode exécute une opération arithmétique et ne valide pas à l'avance les opérandes pour empêcher le dépassement de capacité.
Description de la règle
Les opérations arithmétiques ne doivent pas être exécutées sans valider au préalable les opérandes afin de s'assurer que le résultat de l'opération ne se trouve pas hors de la plage des valeurs possibles pour les types de données impliqués. Selon le contexte d'exécution et les types de données impliqués, le dépassement de capacité arithmétique peut engendrer un System.OverflowException ou la suppression des bits de poids fort du résultat.
Comment corriger les violations
Pour corriger une violation de cette règle, validez les opérandes avant d'exécuter l'opération.
Quand supprimer les avertissements
Il est possible de supprimer sans risque un avertissement de cette règle si les valeurs possibles des opérandes sont dans l'incapacité systématique de provoquer le dépassement de capacité de l'opération arithmétique.
Exemple de violation
Description
Une méthode dans l'exemple suivant manipule un entier qui viole cette règle. Visual Basic requiert la désactivation de l'option de dépassement Supprimer pour son déclenchement.
Code
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;
}
}
}
Commentaires
Si, dans cet exemple, la méthode est passée MinValue, l'opération va faire l'objet d'un dépassement de capacité négatif. Le bit le plus significatif du résultat est alors ignoré. Le code suivant montre comment cela se produit.
[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
Sortie
2147483647
Résoudre avec validation du paramètre d'entrée
Description
L'exemple suivant résout la violation précédente en validant la valeur d'entrée.
Code
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;
}
}
}
Résoudre avec un bloc checked
Description
L'exemple suivant résout la violation précédente en encapsulant l'opération dans un bloc checked. Si l'opération provoque un dépassement de capacité, une System.OverflowException sera levée.
Notez que les blocs checked ne sont pas pris en charge dans Visual Basic.
Code
using System;
namespace Samples
{
public static class Calculator
{
public static int Decrement(int input)
{
checked
{
input--;
}
return input;
}
}
}
Activer la vérification des dépassements de capacité arithmétiques positifs et négatifs
Si vous activez la vérification des dépassements de capacité arithmétiques positifs et négatifs en C#, cela équivaut à encapsuler chaque opération sur des entiers dans un bloc checked.
Pour activer la vérification des dépassements de capacité arithmétiques positifs et négatifs en C#
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur votre projet, puis sélectionnez Propriétés.
Sélectionnez l'onglet Build, puis cliquez sur Avancé.
Sélectionnez Vérifier les dépassements de capacité arithmétiques positifs et négatifs et cliquez sur OK.