bugprone-suspicious-enum-usage

该检查器检测枚举可能被错误使用(作为位掩码)的各种情况。

  1. 当在来自不同类型且这些类型值范围不重叠的两个枚举之间使用“ADD”或“按位 OR”时。

以下情况仅在使用 StrictMode 时才会被调查。如果以下三个条件同时满足,我们将枚举视为(可疑的)位掩码

因此,只要非 2 的幂元素用作位掩码元素,我们就会诊断出误用并发出警告。

  1. 调查 +=|= 运算符的右侧。

  2. 仅检查 |+ 运算符的枚举值侧,如果其中一个不是枚举 val。

  3. 检查 |+ 运算符的两侧,其中枚举值来自同一个枚举类型。

示例

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