Partager via


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#

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

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

  3. Sélectionnez Vérifier les dépassements de capacité arithmétiques positifs et négatifs et cliquez sur OK.

Voir aussi

Référence

Opérateurs C#

Checked et Unchecked (référence C#)

System.OverflowException