CA2233: Evitare l'overflow delle operazioni
TypeName |
OperationsShouldNotOverflow |
CheckId |
CA2233 |
Category |
Microsoft.Usage |
Breaking Change |
Non sostanziale |
Causa
Un metodo esegue un'operazione aritmetica e non convalida gli operandi in anticipo per impedire l'overflow.
Descrizione della regola
Le operazioni aritmetiche non devono essere eseguite senza prima convalidare gli operandi per assicurarsi che il risultato dell'operazione sia compreso nell'intervallo dei valori possibili per i tipi di dati utilizzati.A seconda del contesto di esecuzione e dai tipi di dati utilizzati, l'overflow aritmetico può generare OverflowException oppure fare sì che i bit più significativi del risultato vengano ignorati.
Come correggere le violazioni
Per correggere una violazione di questa regola, convalidare gli operandi prima di eseguire l'operazione.
Esclusione di avvisi
La soppressione di un avviso da questa regola è sicura se i valori possibili degli operandi non possono causare l'overflow dell'operazione aritmetica.
Esempio di una violazione
Descrizione
Un metodo nell'esempio riportato di seguito per la modifica di un numero intero che viola la regola.Affinché l'operazione possa riuscire, in Visual Basic è necessario che l'opzione di overflow di numeri interi Rimuovi sia disabilitata.
Codice
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;
}
}
}
Commenti
Se al metodo in questo esempio viene passato MinValue, si verificherà un underflow dell'operazione.Di conseguenza, il bit più significativo del risultato verrà scartato.Nel codice riportato di seguito viene illustrata questa operazione.
[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
Correzione tramite convalida dei parametri di input
Descrizione
Nell'esempio seguente viene corretta la violazione precedente convalidando il valore di input.
Codice
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;
}
}
}
Correzione tramite blocco checked
Descrizione
Nell'esempio seguente viene corretta la violazione precedente eseguendo il wrapping dell'operazione in un blocco checked.Se l'operazione provoca un overflow, verrà generata un'OverflowException.
Si noti che i blocchi checked non sono supportati in Visual Basic.
Codice
using System;
namespace Samples
{
public static class Calculator
{
public static int Decrement(int input)
{
checked
{
input--;
}
return input;
}
}
}
Attivazione dell'overflow/underflow aritmetico
L'attivazione dell'overflow/underflow aritmetico checked in C#, è equivalente all'esecuzione del wrapping di ciascuna operazione su numeri interi in un blocco checked.
Per attivare l'overflow/underflow aritmetico checked in C#
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Proprietà.
Nella scheda Compilazione scegliere Avanzate.
Selezionare Controlla overflow/underflow aritmetico e fare clic su OK.