CA2233 : Les opérations ne doivent pas déborder

Élément Valeur
ID de la règle CA2233
Category Microsoft.Usage
Modification avec rupture Sans rupture

Cause

Une méthode effectue une opération arithmétique et ne valide pas les opérandes au préalable pour empêcher le dépassement de capacité.

Notes

Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.

Description de la règle

N’effectuez pas d’opérations arithmétiques sans valider au préalable les opérandes pour vous assurer que le résultat de l’opération n’est pas en dehors de la plage de valeurs possibles pour les types de données impliqués. Selon le contexte d’exécution et les types de données impliqués, un dépassement arithmétique peut entraîner l’abandon d’un System.OverflowException ou des bits les plus significatifs du résultat.

Comment corriger les violations

Pour corriger une violation de cette règle, validez les opérandes avant d’effectuer l’opération.

Quand supprimer les avertissements

Il est possible de supprimer un avertissement de cette règle si les valeurs possibles des opérandes ne provoquent jamais le dépassement de capacité de l’opération arithmétique.

Exemple de violation

Une méthode de l’exemple suivant manipule un entier qui enfreint cette règle. Visual Basic nécessite que l’option dépassement de capacité d’entier Supprimer soit désactivée pour que cette opération se déclenche.

using System; 

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

Si la méthode de cet exemple reçoit System.Int32.MinValue, l’opération subit un dépassement de capacité négatif. Cela entraîne l’abandon du bit le plus significatif du résultat. Le code suivant montre comment cela se produit.

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

Sortie :

2147483647

Correction avec validation de paramètre d’entrée

L’exemple suivant corrige la violation précédente en validant la valeur d’entrée.

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

Correction avec un bloc activé

L’exemple suivant corrige la violation précédente en encapsulant l’opération dans un bloc coché. Si l’opération provoque un dépassement de capacité, une System.OverflowException est levée.

Les blocs activés ne sont pas pris en charge dans Visual Basic.

using System; 

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

Activer le dépassement/dépassement négatif arithmétique vérifié

Si vous activez le dépassement/dépassement négatif arithmétique vérifié en C#, cela revient à encapsuler chaque opération d’entier dans un bloc activé.

Pour activer le dépassement/dépassement négatif arithmétique vérifié en C# :

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet, puis choisissez Propriétés.

  2. Sélectionnez l’onglet Build, puis cliquez sur Avancé.

  3. Sélectionnez Vérifier le dépassement/dépassement négatif arithmétique, puis cliquez sur OK.

Voir aussi