bugprone-suspicious-enum-usage¶
该检查器检测枚举可能被错误使用(作为位掩码)的各种情况。
当在来自不同类型且这些类型值范围不重叠的两个枚举之间使用“ADD”或“按位 OR”时。
以下情况仅在使用 StrictMode
时才会被调查。如果以下三个条件同时满足,我们将枚举视为(可疑的)位掩码
枚举元素中最多一半是非 2 的幂(因为枚举较短)
除了表示所有选项的枚举常量(所有枚举元素的“按位 OR”运算结果)之外,还有另一个非 2 的幂数字
枚举类型变量/枚举常量用作 + 或“按位 OR”运算符的参数
因此,只要非 2 的幂元素用作位掩码元素,我们就会诊断出误用并发出警告。
调查 += 和 |= 运算符的右侧。
仅检查 | 和 + 运算符的枚举值侧,如果其中一个不是枚举 val。
检查 | 或 + 运算符的两侧,其中枚举值来自同一个枚举类型。
示例
enum { A, B, C };
enum { D, E, F = 5 };
enum { G = 10, H = 11, I = 12 };
unsigned flag;
flag =
A |
H; // OK, disjoint value intervals in the enum types ->probably good use.
flag = B | F; // Warning, have common values so they are probably misused.
// Case 2:
enum Bitmask {
A = 0,
B = 1,
C = 2,
D = 4,
E = 8,
F = 16,
G = 31 // OK, real bitmask.
};
enum Almostbitmask {
AA = 0,
BB = 1,
CC = 2,
DD = 4,
EE = 8,
FF = 16,
GG // Problem, forgot to initialize.
};
unsigned flag = 0;
flag |= E; // OK.
flag |=
EE; // Warning at the decl, and note that it was used here as a bitmask.
选项¶
- StrictMode¶
默认值:0。当非空时,除了不同的枚举使用检查之外,还会额外调查可疑的位掩码使用情况。