Vorgänge sollten nicht überlaufen

Aktualisiert: November 2007

     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.

Behandlung 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ß

Beschreibung

Durch eine Methode im folgenden Beispiel wird eine Ganzzahl bearbeitet, die diese Regel verletzt. Visual Basic erfordert, dass die Option Entfernen für den Ganzzahlüberlauf deaktiviert wird, bevor dieser Vorgang ausgelöst wird.

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

Kommentare

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

Ausgabe

2147483647

Korrektur mit Validierung von Eingabeparametern

Beschreibung

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

Beschreibung

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