Freigeben über


CA2233: Vorgänge sollten nicht überlaufen

TypeName

OperationsShouldNotOverflow

CheckId

CA2233

Kategorie

Microsoft.Usage

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Eine Methode führt einen arithmetischen Vorgang aus und validiert die Operanden nicht im Voraus, um einen Überlauf zu verhindern.

Regelbeschreibung

Arithmetische Operationen sollten erst nach einer Validierung der Operanden ausgeführt werden, um sicherzustellen, dass das Ergebnis der Operation nicht außerhalb des Bereichs möglicher Werte der beteiligten Datentypen liegt. Je nach dem Ausführungskontext und den beteiligten Datentypen kann ein arithmetischer Überlauf entweder zu einer System.OverflowException führen oder bewirken, dass die höchstwertigen Bits des Ergebnisses verworfen werden.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, validieren Sie die Operanden vor der Ausführung des Vorgangs.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn die möglichen Werte der Operanden niemals zu einem Überlauf der arithmetischen Operation führen.

Beispiel für einen Verstoß

Beschreibungen

Eine Methode im folgenden Beispiel manipuliert eine ganze Zahl, die gegen die Regel verstößt. Visual Basic erfordert das Deaktivieren der Ganzzahlüberlaufoption Entfernen, damit der Vorgang ausgelöst werden kann.

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

Kommentar

Wenn an die Methode in diesem Beispiel MinValue übergeben wird, würde ein Unterlauf für die Operation auftreten. Dies bewirkt, dass das höchstwertige Bit des Ergebnisses verworfen wird. Der folgende Code zeigt, wie es dazu kommt.

[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

Output

2147483647

Korrektur mit Validierung von Eingabeparametern

Beschreibungen

Im folgenden Beispiel wird der vorherige Verstoß korrigiert, indem der Wert der Eingabe überprüft wird.

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

Korrektur mit einem Checked-Block

Beschreibungen

Im folgenden Beispiel wird der vorherige Verstoß korrigiert, indem die Operation von einem checked-Block umschlossen wird. Wenn die Operation einen Überlauf verursacht, wird eine System.OverflowException ausgelöst.

Beachten Sie, dass checked-Blöcke in Visual Basic nicht unterstützt werden.

Code

using System; 

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

            return input;        
        }    
    }
}

Aktivieren des mit checked ausgeführten arithmetischen Über-/Unterlaufs

Wenn Sie den mit checked ausgeführten arithmetischen Überlauf/Unterlauf in C# aktivieren, entspricht dies dem Umschließen jeder einzelnen Ganzzahloperation mit einem checked-Block.

So aktivieren Sie den mit checked ausgeführten arithmetischen Überlauf/Unterlauf in C#

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Eigenschaften.

  2. Wählen Sie die Registerkarte Erstellen aus, und klicken Sie dann auf Erweitert.

  3. Wählen Sie Auf arithmetischen Überlauf/Unterlauf überprüfen aus, und klicken Sie auf OK.

Siehe auch

Referenz

C#-Operatoren

Checked und Unchecked (C#-Referenz)

System.OverflowException