Почему FxCop предупреждает о переполнении (CA2233) в этом коде C #? - PullRequest
6 голосов
/ 15 апреля 2010

У меня есть следующая функция для получения int из старшего байта и младшего байта:

public static int FromBytes(byte high, byte low)
{
    return high * (byte.MaxValue + 1) + low;
}

Когда я анализирую сборку с помощью FxCop, я получаю следующее критическое предупреждение:

CA2233: OperationsShouldNotOverflow
Арифметические операции не должны быть сделано без предварительной проверки операнды для предотвращения переполнения.

Я не понимаю, как это может переполниться, поэтому я просто предполагаю, что FxCop слишком усердствует.
Я что-то пропустил? И какие шаги можно предпринять, чтобы исправить то, что у меня есть (или, по крайней мере, заставить предупреждение FxCop исчезнуть!)?

Ответы [ 4 ]

5 голосов
/ 15 апреля 2010

Это делает их как байтовые вычисления.

Попробуйте это

return (int)high * ((int)byte.MaxValue + 1) + (int)low;
4 голосов
/ 15 апреля 2010

Байтовое сложение и множественные результаты являются целочисленными. Максимальное значение здесь - 65535, которое не переполняет int. Просто исключите ошибку.

byte a = 1;
byte b = 2;
object obj = a + b

obj имеет тип int

Попробуйте это:

        byte high = 255;
        byte low = 255;
        checked
        {
            int b = high * (byte.MaxValue + 1) + low;   
        }

Нет проблем.

или попробуйте это

3 голосов
/ 06 мая 2010

Когда Дэниел А. Уайт указал , вы получите сообщение, потому что "(byte.MaxValue + 1)" переполняет байт.

Но вместо приведения и умножения я бы просто сдвинул биты, как показано в коде ниже:

public static int FromBytes(byte high, byte low) {
    return high << 8 | low;
}

Как побочный эффект, этот код, вероятно, будет работать лучше. Я не проверил полученный IL или x86, чтобы увидеть, достаточно ли умен компилятор и / или JITter для оптимизации исходного выражения.

3 голосов
/ 15 апреля 2010

Вот 2 способа, которыми он наконец перестал жаловаться на CA2233 для меня:

    public static int FromBytes(byte high, byte low)
    {
        int h = high;
        return h * (byte.MaxValue + 1) + low;
    }

    public static int FromBytes2(byte high, byte low)
    {
        unchecked
        {
            return high * (byte.MaxValue + 1) + low;
        }
    }

Я думаю, это может быть ошибка в правиле.

...