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