G.EXP.02 不宜在比较中使用不兼容的位掩码

【级别】 要求

【描述】

如果比较的位总是被位掩码设置为零或一,则比较是常量true或 false(取决于掩码、比较值和运算符),这种代码是有误导性的,可能是故意这么写用于赢得一场性能竞赛或者是通过一个测试用例。

可以对照下面表格进行检查。

ComparisonBit OpExampleis alwaysFormula
== or !=&x & 2 == 3falsec & m != c
< or >=&x & 2 < 3truem < c
> or <=&x & 1 > 1falsem <= c
== or !=|x | 1 == 0falsec | m != c
< or >=|x | 1 < 1falsem >= c
<= or >|x | 1 > 0truem > c

【反例】


#![allow(unused)]
fn main() {
let x = 2;
// 不符合:该表达式会永远是 false
if (x & 1 == 2) { }
}

【正例】


#![allow(unused)]
fn main() {
let x = 2;
// 符合
if (x == 2) { }
}

【Lint 检测】

lint nameClippy 可检测Rustc 可检测Lint Grouplevel
bad_bit_maskyesnocorrectnessdeny