As operações não devem estouro
TypeName |
OperationsShouldNotOverflow |
CheckId |
CA2233 |
Category (Categoria) |
Microsoft.uso |
Quebrando alterar |
Não separável |
Causa
Um método executa uma operação aritmética e não validar 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 se certificar de que o resultado da operação não está fora do intervalo dos valores possíveis para os tipos de dados envolvidos.Dependendo do contexto de execução e os tipos de dados envolvidos, estouro aritmético pode resultar em um um System.OverflowException ou os bits mais significativos do resultado descartado.
Como corrigir violações
Para corrigir uma violação dessa regra, valide os operandos antes de executar a operação.
Quando suprimir avisos
É seguro eliminar um aviso essa regra se os valores possíveis dos operandos nunca irão fazer com que a operação aritmética de estouro.
Exemplo de uma violação
Descrição
Um método no exemplo a seguir manipula um número inteiro que violam essa regra.Visual Basic requer o Remover inteiro estouro opção a ser desabilitado 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 ao validar 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 selecionado
Descrição
O exemplo a seguir corrige a violação anterior envolvendo a operação em um bloco selecionado.Se a operação faz com que uma área de excedentes, um System.OverflowException será gerada.
Observe que o check-blocos não são suportados em Visual Basic.
Código
using System;
namespace Samples
{
public static class Calculator
{
public static int Decrement(int input)
{
checked
{
input--;
}
return input;
}
}
}
Ativar verificação estouro aritmético/estouro negativo
Se você ativar marcados estouro aritmético / estouro negativo em translation from VPE for Csharp, é equivalente a quebra automática de cada operação inteiro em um bloco selecionado.
Para ativar o check-estouro/estouro de negativo aritmético em translation from VPE for Csharp
In O gerenciador de soluções, clicar com o botão direito do mouse em seu projeto e escolher Propriedades.
selecionar o Compilação guia e clicar Avançado.
selecionar Verificar Estouro Aritmético/Estouro negativo e clicar OK.