CA2233 : Les opérations ne doivent pas déborderCA2233: Operations should not overflow

TypeNameTypeName OperationsShouldNotOverflowOperationsShouldNotOverflow
CheckIdCheckId CA2233CA2233
CategoryCategory Microsoft.UsageMicrosoft.Usage
Modification avec ruptureBreaking Change Sans ruptureNon Breaking

CauseCause

Une méthode exécute une opération arithmétique et ne valide pas au préalable les opérandes pour empêcher un débordement.A method performs an arithmetic operation and does not validate the operands beforehand to prevent overflow.

Description de la règleRule description

Ne pas effectuer des 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.Don't perform arithmetic operations without first validating the operands to make sure that the result of the operation is not outside the range of possible values for the data types involved. Selon le contexte d’exécution et les types de données impliquées, dépassement de capacité arithmétique peut engendrer un System.OverflowException ou ignoré les bits les plus significatifs du résultat.Depending on the execution context and the data types involved, arithmetic overflow can result in either a System.OverflowException or the most significant bits of the result discarded.

Comment corriger les violationsHow to fix violations

Pour corriger une violation de cette règle, validez les opérandes avant d’effectuer l’opération.To fix a violation of this rule, validate the operands before you perform the operation.

Quand supprimer les avertissementsWhen to suppress warnings

Il est possible de supprimer un avertissement de cette règle si les valeurs possibles des opérandes ne provoquent jamais de dépassement de capacité de l’opération arithmétique.It is safe to suppress a warning from this rule if the possible values of the operands will never cause the arithmetic operation to overflow.

Exemple de ViolationExample of a Violation

Une méthode dans l’exemple suivant manipule un entier qui enfreint cette règle.A method in the following example manipulates an integer that violates this rule. Visual BasicVisual Basic nécessite le *supprimer* l’option de dépassement doit être désactivée pour cette option pour déclencher. requires the *Remove* integer overflow option to be disabled for this to fire.

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

Si la méthode dans cet exemple est passée System.Int32.MinValue, l’opération provoquait le dépassement de capacité négatif.If the method in this example is passed System.Int32.MinValue, the operation would underflow. Par conséquent, le bit le plus significatif du résultat sont ignorés.This causes the most significant bit of the result to be discarded. Le code suivant montre comment cela se produit.The following code shows how this occurs.

public static void Main()
{
    int value = int.MinValue;    // int.MinValue is -2147483648
    value = Calculator.Decrement(value);
    Console.WriteLine(value);
}
Public Shared Sub Main()
    Dim value = Integer.MinValue    ' Integer.MinValue is -2147483648
    value = Calculator.Decrement(value)
    Console.WriteLine(value)
End Sub

Sortie :Output:

2147483647

Résoudre avec Validation de paramètre d’entréeFix with Input Parameter Validation

L’exemple suivant résout la violation précédente en validant la valeur d’entrée.The following example fixes the previous violation by validating the value of input.

using System; 

namespace Samples
{    
    public static class Calculator    
    {        
        public static int Decrement(int input)        
        {            
            if (input == int.MinValue)                
                throw new ArgumentOutOfRangeException(nameof(input), "input must be greater than Int32.MinValue");
                             
            input--;             
            return input;        
        }    
    }
}
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

Résoudre avec un bloc CheckedFix with a Checked Block

L’exemple suivant résout la violation précédente en encapsulant l’opération dans un bloc checked.The following example fixes the previous violation by wrapping the operation in a checked block. Si l’opération provoque un dépassement de capacité, une System.OverflowException sera levée.If the operation causes an overflow, a System.OverflowException will be thrown.

Blocs vérifiés ne sont pas pris en charge dans Visual BasicVisual Basic.Checked blocks are not supported in Visual BasicVisual Basic.

using System; 

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

Activer Checked arithmétiques dépassement de capacité positifs et négatifsTurn on Checked Arithmetic Overflow/Underflow

Si vous activez checked arithmétiques dépassement de capacité positifs et négatifs en c#, il est équivalent à chaque opération entière d’habillage dans un bloc checked.If you turn on checked arithmetic overflow/underflow in C#, it is equivalent to wrapping every integer operation in a checked block.

Pour activer checked arithmétiques dépassement de capacité positifs et négatifs en c# :To turn on checked arithmetic overflow/underflow in C#:

  1. Dans l’Explorateur de solutions, cliquez sur votre projet et choisissez propriétés.In Solution Explorer, right-click your project and choose Properties.

  2. Sélectionnez l’onglet Build, puis cliquez sur Avancé.Select the Build tab and click Advanced.

  3. Sélectionnez vérifier les dépassements arithmétiques et cliquez sur OK.Select Check for arithmetic overflow/underflow and click OK.

Voir aussiSee also