bugprone-too-small-loop-variable

检测那些 for 循环,它们的循环变量类型“太小”,这意味着该类型无法表示迭代范围内的所有值。

int main() {
  long size = 294967296l;
  for (short i = 0; i < size; ++i) {}
}

for 循环是一个无限循环,因为 short 类型无法表示 [0..size] 区间内的所有值。

在实际用例中,size 代表容器的大小,它取决于用户输入。

int doSomething(const std::vector& items) {
  for (short i = 0; i < items.size(); ++i) {}
}

此算法适用于少量对象,但对于较大的用户输入会导致程序冻结。

建议同时启用编译器警告 -Wtautological-constant-out-of-range-compare,因为检查不会检查编译时常量循环边界以避免与警告重叠。

MagnitudeBitsUpperLimit

循环变量大小位数的上限。如果设置了该选项,检查将过滤掉那些循环变量类型的大小位数超过指定上限的捕获。默认值为 16。例如,如果用户将此选项设置为 31(位),则 32 位 unsigned int 将被检查忽略,但 32 位 int 不会(32 位 signed int 有 31 个大小位)。

int main() {
  long size = 294967296l;
  for (unsigned i = 0; i < size; ++i) {} // no warning with MagnitudeBitsUpperLimit = 31 on a system where unsigned is 32-bit
  for (int i = 0; i < size; ++i) {} // warning with MagnitudeBitsUpperLimit = 31 on a system where int is 32-bit
}