CA2233: as operações não devem estourar
TypeName |
OperationsShouldNotOverflow |
CheckId |
CA2233 |
Categoria |
Microsoft.Usage |
Alteração Significativa |
Sem Quebra |
Causa
Um método realiza uma operação aritmética e não valida os operandos com antecedência para evitar estouro.
Descrição da Regra
Operações aritméticas não devem ser executadas sem primeiro validar os operandos para garantir que o resultado da operação não está fora do intervalo de valores possíveis para os tipos de dados envolvidos.Dependendo do contexto de execução e os tipos de dados envolvidos, o estouro aritmético pode resultar em OverflowException ou a bit mais significativo de resultado descartado.
Como Corrigir Violações
Para corrigir uma violação desta regra, valide os operandos antes de executar a operação.
Quando Suprimir Alertas
É seguro suprimir um aviso dessa regra se os valores possíveis dos operandos nunca causam a operação aritmética estouro.
Exemplo de uma Violação
Descrição
Um método no exemplo manipula um inteiro que viola esta regra.Visual Basic requer a opção de estouro de inteiro de Remover ser desabilitado para que esse seja acionado.
Código
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;
}
}
}
Comentários
Se o método neste exemplo é MinValuepassado, a operação estouro negativo.Isso faz com que o bit mais significativo de resultado a ser descartado.As seguintes do código mostra como isso ocorre.
[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
Saída
2147483647
Correção com validação de parâmetro de entrada
Descrição
O exemplo a seguir corrige a violação anterior validando o valor de entrada.
Código
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;
}
}
}
Correção com um bloco verificado
Descrição
O exemplo a seguir corrige a violação anterior envolvendo a operação em um bloco verificado.Se a operação faz com que um estouro, OverflowException será gerado.
Observe que os blocos verificados não tenham suporte em Visual Basic.
Código
using System;
namespace Samples
{
public static class Calculator
{
public static int Decrement(int input)
{
checked
{
input--;
}
return input;
}
}
}
Ativar o estouro aritmético/estouro negativo verificados
Se você ativar o estouro aritmético/estouro negativo verificados no C#, é equivalente a envolver cada operação de inteiro em um bloco verificado.
Para ativar verificado que o estouro aritmético/estouro negativo em C#
Em Gerenciador de Soluções, clique com o botão direito do mouse no projeto e escolha Propriedades.
Selecione a guia de Compilar e clique em Avançado.
Verificar o estouro aritmético/estouro negativo Selecione e clique em OK.