Возможно непреднамеренная оценка выражения из-за правил приоритета оператора

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

Описание

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

Дефект подсвечивает выражения формы 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