Sdílet prostřednictvím


CA2233: Operace by neměly přetéct

TypeName

OperationsShouldNotOverflow

CheckId

CA2233

Kategorie

Microsoft.Usage

Narušující změna

Nenarušující

Příčina

Metoda provádí aritmetickou operaci, přičemž předem neověřuje operandy, aby se zabránilo přetečení.

Popis pravidla

Aritmetické operace by neměly být prováděny bez předchozího ověření operandů, aby bylo zajištěno, že výsledek operace není mimo rozsah možných hodnot použitých datových typů.V závislosti na kontextu spuštění a použitých datových typech může aritmetické přetečení vyústit buď ve výjimku OverflowException nebo v zahození bitů s největšími vahami ve výsledku.

Jak vyřešit porušení

Chcete-li opravit porušení tohoto pravidla, ověřte operandy před provedením operace.

Kdy potlačit upozornění

Potlačení upozornění tohoto pravidla je bezpečné, pokud hodnoty operandů nemohou za žádné situace způsobit přetečení aritmetické operace.

Příklad porušení

Description

Metoda v následujícím příkladu pracuje s celým číslem porušujícím toto pravidlo.Aby bylo možné tento kód spustit, jazyk Visual Basic vyžaduje zákaz možnosti přetečení celého čísla Odebrat.

Kód

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

Komentáře

Je-li metodě v tomto příkladu předán argument MinValue, operace podteče.To zapříčiní zahození bitu s největší váhou ve výsledku.Následující kód ukazuje, jak k tomu dochází.

[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

Výsledek

2147483647

Oprava ověřením vstupního parametru

Description

Následující příklad opravuje předchozí porušení ověřením hodnoty vstupu.

Kód

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

Oprava kontrolovaným blokem

Description

Následující příklad opravuje předchozí porušení obalením operace do kontrolovaného bloku.Pokud operace způsobí přetečení, je vyvolána výjimka OverflowException.

Povšimněte si, že v jazyce Visual Basic nejsou kontrolované bloky podporovány.

Kód

using System; 

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

            return input;        
        }    
    }
}

Zapnutí kontrolovaného zapříčiní přetečení a podtečení

Zapnutí kontrolovaného aritmetického přetečení a podtečení v jazyce C# je ekvivalentní k zabalení všech celočíselných operací do kontrolovaného bloku.

Zapnutí kontrolovaného aritmetického přetečení a podtečení v jazyce C#

  1. V Průzkumníku řešení klikněte pravým tlačítkem na projekt a zvolte Vlastnosti.

  2. Zvolte záložku Sestavení a klikněte na Pokročilé.

  3. Zvolte Kontrolovat aritmetické přetečení a podtečení a klikněte na tlačítko OK.

Viz také

Referenční dokumentace

Operátory jazyka C#

Zaškrtnuto a nezaškrtnuto (Referenční dokumentace jazyka C#)

OverflowException