Почему FxCop предупреждает о переполнении (CA2233) в этом коде C#?

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

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

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

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

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

6
задан Alfred Myers 9 June 2012 в 13:47
поделиться

4 ответа

Как Daniel A. White указал, вы получаете сообщение, потому что "(byte.MaxValue + 1)" переполняет байт.

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

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

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

3
ответ дан 8 December 2019 в 16:00
поделиться

Результаты сложения байтов и множественных значений являются целыми числами. Максимальное значение здесь 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;   
        }

Нет проблем.

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

4
ответ дан 8 December 2019 в 16:00
поделиться

Вот два способа, по которым он, наконец, перестал для меня ныть по поводу 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;
        }
    }

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

3
ответ дан 8 December 2019 в 16:00
поделиться

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

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

return (int)high * ((int)byte.MaxValue + 1) + (int)low;
5
ответ дан 8 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: