CA2233: As operações não devem estouro
TypeName |
OperationsShouldNotOverflow |
CheckId |
CA2233 |
<strong>Categoria</strong> |
Microsoft.Usage |
Alteração significativa |
Não separável |
Causa
Um método executa uma operação aritmética e não valida os operandos com antecedência para evitar um estouro.
Descrição da regra
Operações aritméticas não devem ser executadas sem primeiro validar os operandos para certificar-se de 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 um um System.OverflowException ou os bits mais significativos do resultado descartadas.
Como corrigir violações
Para corrigir uma violação desta regra, valide os operandos antes de executar a operação.
Quando suprimir avisos
É seguro eliminar um aviso esta regra se os valores possíveis dos operandos nunca fará com que a operação de estouro aritmética.
Exemplo de uma violação
Descrição
Um método no exemplo a seguir manipula um número inteiro que viola essa regra.Visual Basicrequer o Remover opção de estouro de inteiro a ser desativado para que isso 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 é passado MinValue, a operação seria estouro negativo.Isso faz com que o bit mais significativo do resultado sejam descartados.O código a seguir 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
Corrigir com validação de parâmetro de entrada
Descrição
O exemplo a seguir corrige a violação anterior, validando o valor da 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;
}
}
}
Corrigir com um bloco marcado
Descrição
O exemplo a seguir corrige a violação anterior encapsulando a operação em um bloco marcado.Se a operação faz com que uma área de excedentes, um System.OverflowException será lançada.
Observe que os blocos marcados não são suportados no Visual Basic.
Código
using System;
namespace Samples
{
public static class Calculator
{
public static int Decrement(int input)
{
checked
{
input--;
}
return input;
}
}
}
Ativar Checked estouro aritmético/estouro negativo
Se você ativar checked aritmético estouro/estouro negativo em C#, é equivalente à disposição de cada operação de inteiro em um bloco marcado.
Para ativar o check-estouro/estouro de negativo aritmético em C#
Em Solution Explorer, seu projeto com o botão direito e escolha Propriedades.
Selecione o Build guia e clique em Advanced.
Selecione Verificar estouro aritmético/estouro negativo e clique em OK.