Possibly unintended evaluation of expression because of operator precedence rules

Правила приоритета оператора вызывают неожиданный порядок оценки в арифметическом выражении

Описание

Этот дефект происходит, когда результат арифметического выражения возможно непреднамерен, потому что правила приоритета оператора диктуют порядок оценки, что вы не ожидаете.

Дефект подсвечивает выражения формы x op_1 y op_2 z. Здесь, op_1 и op_2 комбинации оператора, которые обычно вызывают эту ошибку. Например, x == y | z.

Средство проверки не отмечает все комбинации оператора. Например, x == y || z не отмечается, потому что вы, скорее всего, намеревались выполнить логический OR между x == y и z. А именно, средство проверки отмечает эти комбинации:

  • && и ||: Например, x || y && z или x && y || z.

  • Присвоение и битовые операции: Например, x = y | z.

  • Присвоение и операции сравнения: Например, x = y != z или x = y > z.

  • Операции сравнения: Например, x > y > z (кроме тех случаев, когда одно из сравнений является равенством x == y > z).

  • Сдвиг и числовая операция: Например, x << y + 2.

  • Указатель разыменовывает и арифметика: Например, *p++.

Риск

Дефект может вызвать следующие проблемы:

  • Если вы или другой рецензент кода рассматриваете код, намеченный порядок оценки не сразу понятен.

  • Возможно, что результат оценки не оправдывает ваши надежды. Например:

    • В операции *p++, возможно, что вы ожидаете, что разыменованное значение будет постепенно увеличено. Однако указатель p постепенно увеличивается перед разыменовыванием.

    • В операции (x == y | z), возможно, что вы ожидаете x быть по сравнению с y | z. Однако == операция происходит перед | операция.

Фиксация

Смотрите, является ли порядок оценки тем, что вы предназначаете. В противном случае применяйтесь, круглые скобки, чтобы реализовать оценку приказывают, чтобы вы хотели.

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

Примеры

развернуть все

int test(int a, int b, int c) {
    return(a & b == c);
}

В этом примере, == операция происходит сначала, сопровождаемая & операция. Если вы предназначили обратный порядок операций, результат не то, что вы ожидаете.

Коррекция — круглая скобка для намеченного порядка

Одна возможная коррекция должна применить круглую скобку, чтобы реализовать намеченный порядок оценки.

int test(int a, int b, int c) {
    return((a & b) == c);
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: OPERATOR_PRECEDENCE
Удар: высоко
ID CWE: 783
Введенный в R2015b