CA2233: Operacje nie powinny prowadzić do przepełnienia
TypeName |
OperationsShouldNotOverflow |
CheckId |
CA2233 |
Kategoria |
Microsoft.Usage |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Metoda wykonuje operację arytmetyczną i nie sprawdza poprawności argumentów aby zapobiec przepełnieniu.
Opis reguły
Operacje arytmetyczne nie powinny być wykonywane bez wcześniejszego sprawdzenia argumentów w celu upewnienia się, że wynik operacji nie znajduje się poza zakresem możliwych wartości dla uwzględnionych typów danych.W zależności od kontekstu wykonywania i uwzględnionych typów danych przepełnienie arytmetyczne może spowodować wystąpienie wyjątku OverflowException lub odrzucenie najbardziej znaczących bitów wyniku.
Jak naprawić naruszenia
W celu naprawienia naruszenia tej reguły należy sprawdzić poprawność argumentów przed wykonaniem operacji.
Kiedy pominąć ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli możliwe wartości argumentów nigdy nie spowodują przepełnienia operacji arytmetycznej.
Przykład naruszenia
Opis
Metoda w poniższym przykładzie manipuluje liczbą całkowitą, która narusza tę regułę.W celu uruchomienia poniższego kodu w Visual Basic wymagane jest, aby opcja Usuń przepełnienie liczby całkowitej była wyłączona.
Kod
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;
}
}
}
Komentarze
Jeśli do metoda w tym przykładzie zostanie przekazane MinValue podczas operacji wystąpi niedopełnienie.Spowoduje to odrzucenie najbardziej znaczącego bitu wyniku.Poniższy kod ilustruje to wystąpienie.
[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
Dane wyjściowe
2147483647
Naprawa przy użyciu sprawdzania poprawności parametru wejściowego
Opis
Poniższy przykład naprawia poprzednie naruszenie weryfikując wartość danych wejściowych.
Kod
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;
}
}
}
Naprawa przy użyciu bloku sprawdzanego
Opis
Poniższy przykład rozwiązuje poprzednie naruszenie umieszczając operację w bloku sprawdzanym.Jeśli operacja powoduje przepełnienie, zostanie zgłoszony wyjątek OverflowException.
Należy zauważyć, że bloki sprawdzane nie są obsługiwane w Visual Basic.
Kod
using System;
namespace Samples
{
public static class Calculator
{
public static int Decrement(int input)
{
checked
{
input--;
}
return input;
}
}
}
Włączenie sprawdzania przepełnienia/niedopełnienia operacji arytmetycznych
Włączenia sprawdzania przepełnienia/niedopełnienia operacji arytmetycznych w języku C# jest równoznaczne z umieszczaniem każdej operacji na liczbach całkowitych w bloku sprawdzanym.
Włączenie sprawdzania przepełnienia/niedopełnienia operacji arytmetycznych w języku C#
W Eksploratorze rozwiązania, kliknij prawym przyciskiem myszy projekt i wybierz Właściwości.
Wybierz kartę Kompilacja i kliknij Zaawansowane.
Wybierz Sprawdzaj przepełnienie/niedopełnienie operacji arytmetycznych i kliknij przycisk OK.