# V3155. The expression is incorrect or it can be simplified.

Анализатор обнаружил подозрительное выражение, результат которого всегда будет равен одному из его операндов. Такие выражения могут являются избыточными по задумке автора, и должны передать какую-то идею тем, кто будет сопровождать код. А возможно это просто ошибка.

Рассмотрим простой вариант, как может выглядеть ошибка:

    var a = 11 - b + c * 1;

Переменная 'c' умножается на '1', что является избыточным. Возможно, была допущена опечатка и вместо 1 должно быть написано, например 10:

    var a = 11 - b + c * 10;

Давайте теперь рассмотрим случай из реального проекта, когда избыточность была добавлена сознательно, но неудачно:

    detail.Discount = i * 1 / 4M;

Программист имел в виду, что переменная 'i' должна умножаться на значение одна четвёртая. Да, можно было сразу написать 0.25, но 1/4 лучше может передавать смысл алгоритма.

Однако, получилось не очень удачно. В начале выполняется умножение переменной 'i' на 1 и только затем происходит деление. Да, результат получится один и тот же. Но такой код может сбить с толку человека. И по этой причине он не нравится и анализатору, который выдаст здесь предупреждение.

Чтобы код стал более читаемым, а анализатор перестал выдавать предупреждение, лучше добавить скобки:

    detail.Discount = i * (1 / 4M);

Еще один пример из реального проекта:

    public virtual ValueBuffer GetIncludeValueBuffer(int queryIndex)
    {
      return queryIndex == 0
        ? _activeQueries[_activeIncludeQueryOffset + queryIndex].Current
        : _activeIncludeQueries[queryIndex - 1].Current;
    }

В данном случае '_activeIncludeQueryOffset' всегда будет складываться с нулем, так как выше находится проверка 'queryIndex == 0'. Скорее всего это не ошибка, но код можно упростить:

    public virtual ValueBuffer GetIncludeValueBuffer(int queryIndex)
    {
        return queryIndex == 0
        ? _activeQueries[_activeIncludeQueryOffset].Current
        : _activeIncludeQueries[queryIndex - 1].Current;
    }

Примечание. Анализатор не ругается на случаи, когда рядом с подозрительным выражением находится подобное ему выражение. Пример:

    A[i+0]=1;
    A[i+1]=10;
    A[i+2]=100;
    A[i+3]=1000;
    A[i+4]=10000;

Выражение 'i + 0' является избыточным. Но рядом располагаются подобные выражения вида 'i + литерал'. Поэтому можно сделать вывод, что сложение с 0 было сделано сознательно, для соблюдения общего стиля написания.

Данная диагностика классифицируется как:

CWE-682