V3227. The precedence of the arithmetic operator is higher than that of the shift operator. Consider using parentheses in the expression.
Анализатор обнаружил потенциальную ошибку: выражение может выдавать не тот результат, на который рассчитывал программист. Причина в том, что операции сложения, вычитания, деления и умножения имеют более высокий приоритет, чем операции сдвига.
Рассмотрим пример:
private BigInteger OddPow (uint b, BigInteger exp)
{
uint [] wkspace = new uint [mod.length << 1 + 1];
....
}
Скорее всего, разработчик ожидал, что результат сдвига mod.length на 1 будет сложен с 1. Но согласно приоритету операций, вначале произойдёт сложение, а уже потом — сдвиг. Для исправления нужно добавить скобки.
Корректный вариант кода:
private BigInteger OddPow (uint b, BigInteger exp)
{
uint [] wkspace = new uint [(mod.length << 1) + 1];
....
}
Данная диагностика классифицируется как: