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