Анализатор обнаружил не работающую из-за неявного приведения типа проверку на переполнение.
Рассмотрим пример:
bool IsValidAddition(ushort x, ushort y) { if (x + y < x) return false; return true; }
Цель данного метода — проверить, произойдет ли переполнение при сложении двух положительных чисел. В случае переполнения результат суммы должен оказаться меньше любого из её операндов.
Однако проверка не выполнит свою задачу, поскольку оператор '+' не имеет перегрузки для сложения чисел с типом 'ushort'. В результате оба числа будут в начале приведены к типу 'int', после чего выполнится их сложение. Так как складываются значения типа 'int', никакого переполнения не произойдёт.
Для исправления проверки нужно явно привести результат суммы к типу 'ushort':
bool IsValidAddition(ushort x, ushort y) { if ((ushort)(x + y) < x) return false; return true; }
Кромe типа 'ushort', перегрузка оператора суммы отсутствует и для чисел с типом 'byte'. Перед сложением эти числа также будут неявно приведены к 'int' типу.
Данная диагностика классифицируется как: