Udostępnij za pośrednictwem


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#

  1. W Eksploratorze rozwiązania, kliknij prawym przyciskiem myszy projekt i wybierz Właściwości.

  2. Wybierz kartę Kompilacja i kliknij Zaawansowane.

  3. Wybierz Sprawdzaj przepełnienie/niedopełnienie operacji arytmetycznych i kliknij przycisk OK.

Zobacz też

Informacje

Operatory C#

checked i unchecked (odwołanie w C#)

OverflowException