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。当非空时,除了不同的枚举使用检查之外,还会额外调查可疑的位掩码使用情况。