Condividi tramite


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 System.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

Oggetto di 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

Oggetto di 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

Oggetto di 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'System.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#

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Proprietà.

  2. Nella scheda Compilazione scegliere Avanzate.

  3. Selezionare Controlla overflow/underflow aritmetico e fare clic su OK.

Vedere anche

Riferimenti

C# Operators

Checked and Unchecked (C# Reference)

System.OverflowException