У меня есть следующая функция для получения интервала от высокого байта и младшего байта:
public static int FromBytes(byte high, byte low)
{
return high * (byte.MaxValue + 1) + low;
}
Когда я анализирую блок с FxCop, я получаю соблюдающее критическое предупреждение:
CA2233: OperationsShouldNotOverflow
Арифметические операции не должны быть сделаны без первой проверки операндов для предотвращения переполнения.
Я не вижу, как это могло возможно переполниться, таким образом, я просто предполагаю, что FxCop фанатичен.
Я пропускаю что-то? И какие шаги могли быть сделаны для исправления то, что я имею (или по крайней мере делают FxCop, предупреждающий, уходят!)?
Как Daniel A. White указал, вы получаете сообщение, потому что "(byte.MaxValue + 1)" переполняет байт.
Но вместо приведения и умножения я бы просто сдвинул биты, как это сделано в приведенном ниже коде:
public static int FromBytes(byte high, byte low) {
return high << 8 | low;
}
Как побочный эффект, этот код, вероятно, будет работать лучше. Я не проверял результирующий IL или x86, чтобы узнать, достаточно ли умны компилятор и/или JITter, чтобы оптимизировать исходное выражение.
Результаты сложения байтов и множественных значений являются целыми числами. Максимальное значение здесь 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;
}
Нет проблем.
или попробуйте это
Вот два способа, по которым он, наконец, перестал для меня ныть по поводу 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;
}
}
Я думаю, что это может быть ошибка в правиле.
Он выполняет их как байтовые вычисления.
Попробуйте это
return (int)high * ((int)byte.MaxValue + 1) + (int)low;