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#
V Průzkumníku řešení klikněte pravým tlačítkem na projekt a zvolte Vlastnosti.
Zvolte záložku Sestavení a klikněte na Pokročilé.
Zvolte Kontrolovat aritmetické přetečení a podtečení a klikněte na tlačítko OK.
Viz také
Referenční dokumentace
Zaškrtnuto a nezaškrtnuto (Referenční dokumentace jazyka C#)