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#
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Eigenschaften.
Wählen Sie die Registerkarte Erstellen aus, und klicken Sie dann auf Erweitert.
Wählen Sie Auf arithmetischen Überlauf/Unterlauf überprüfen aus, und klicken Sie auf OK.