Поделиться через


CA2233: в операциях не должно быть переполнений

TypeName

OperationsShouldNotOverflow

CheckId

CA2233

Категория

Microsoft.Usage

Критическое изменение

Не критическое

Причина

Метод выполняет арифметическую операцию и предварительно не проверяет операнды для предотвращения переполнения.

Описание правила

Для выполнения арифметических операций сначала должны быть проверены операнды, чтобы удостовериться в том, что результат операции находится в диапазоне возможных значений для используемых типов данных.В зависимости от контекста выполнения и используемых типов данных, арифметическое переполнение может приводить к OverflowException или пропуску старших разрядов результата.

Устранение нарушений

Чтобы исправить нарушение этого правила, перед выполнением операции проверьте операнды.

Отключение предупреждений

Предупреждение из этого правила можно отключить без последствий, если арифметические значения операндов никогда не приведут к переполнению арифметической операции.

Пример нарушения

Описание

В следующем примере метод управляет целым числом, нарушающим это правило.Для срабатывания Visual Basic требуется, чтобы параметр переполнения целого числа Remove был отключен.

Код

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;        
        }    
    }
}

Комментарии

Если бы метод в этом примере был передан MinValue, то произошло бы переполнение операции.В этом случае старшие разряды результата отбрасываются.В следующем коде показано, как это происходит.

[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

Исправление путем проверки входного параметра

Описание

В следующем примере осуществляется исправление ранее возникшего нарушения путем проверки входного значения.

Код

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;        
        }    
    }
}

Исправление с помощью проверенного блока

Описание

В следующем примере осуществляется исправление ранее возникшего нарушения путем заключения операции в проверенный блок.Если операция вызывает переполнение, возникает OverflowException.

Следует помнить, что проверенные блоки не поддерживаются в Visual Basic.

Код

using System; 

namespace Samples
{    
    public static class Calculator    
    {        
        public static int Decrement(int input)        
        {            
            checked            
            {                
                input--;            
            }                        

            return input;        
        }    
    }
}

Включение проверенного арифметического переполнения/потери точности

Включение проверенного арифметического переполнения/потери точности в C# эквивалентно заключению каждой операции с целым числом в проверенный блок.

Чтобы включить проверенное арифметическое переполнение/потерю точности в C#

  1. В Обозревателе решений щелкните правой кнопкой мыши проект и выберите команду Свойства.

  2. Перейдите на вкладку Построение и щелкните Дополнительно.

  3. Измените свойство Проверять арифметические переполнения и потери точности и нажмите ОК.

См. также

Ссылки

Операторы C#

Checked и Unchecked (Справочник по C#)

OverflowException