Правила приоритета оператора вызывают неожиданный порядок оценки в арифметическом выражении
Этот дефект происходит, когда результат арифметического выражения возможно непреднамерен, потому что правила приоритета оператора диктуют порядок оценки, что вы не ожидаете.
Дефект подсвечивает выражения формы 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 |