exponenta event banner

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

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

Описание

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

Дефект выделяет выражения формы x op_1 y op_2 z. Здесь, op_1 и op_2 - комбинации операторов, которые обычно вызывают эту ошибку. Например, 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 > 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
Воздействие: Высокое
ИДЕНТИФИКАТОР CWE: 783
Представлен в R2015b