V3204. The expression is always false due to implicit type conversion. Overflow check is incorrect.
Анализатор обнаружил не работающую из-за неявного приведения типа проверку на переполнение.
Рассмотрим пример:
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' типу.
Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки целочисленного переполнения и некорректного совместного использования знаковых и беззнаковых чисел. |
Данная диагностика классифицируется как: