bugprone-redundant-branch-condition

查找嵌套的 if 语句中条件变量,这些变量也在外部 if 语句中被检查,并且没有被更改。

简单示例

bool onFire = isBurning();
if (onFire) {
  if (onFire)
    scream();
}

这里 onFire 在外部的 if 和内部的 if 语句中都被检查了,两次检查之间没有可能更改。检查器会针对此代码发出警告,并建议删除对变量 onFire 的第二次检查。

检查器还会检测冗余的条件检查,如果条件变量是逻辑“与” (&&) 或逻辑“或” (||) 运算符的操作数。

bool onFire = isBurning();
if (onFire) {
  if (onFire && peopleInTheBuilding > 0)
    scream();
}
bool onFire = isBurning();
if (onFire) {
  if (onFire || isCollapsing())
    scream();
}

在第一种情况下(逻辑“与”),建议的修复方法是删除冗余的条件变量并保留 && 的另一侧。在第二种情况下(逻辑“或”),整个 if 会被移除,类似于上面简单情况下的做法。

外部 if 语句的条件也可能是逻辑“与” (&&) 表达式。

bool onFire = isBurning();
if (onFire && fireFighters < 10) {
  if (someOtherCondition()) {
    if (onFire)
      scream();
  }
}

如果外部语句是逻辑“与” (&&),而内部语句是逻辑“与” (&&) 或“或” (||),则也会检测到错误。内部 if 语句不必是外部语句的直接子代。

如果条件变量可能在两次检查之间发生更改,则不会检测到错误。

bool onFire = isBurning();
if (onFire) {
  tryToExtinguish(onFire);
  if (onFire && peopleInTheBuilding > 0)
    scream();
}

将考虑所有可能的更改,因此如果条件变量不是函数的局部变量,它是一个 volatile 变量或具有别名(指针或引用),则不会发出警告。

已知限制

目前不会检查 else 分支以查找条件变量的否定值。

bool onFire = isBurning();
if (onFire) {
  scream();
} else {
  if (!onFire) {
    continueWork();
  }
}

检查器目前只检测对单个条件变量的冗余检查。不会检查更复杂的表达式。

if (peopleInTheBuilding == 1) {
  if (peopleInTheBuilding == 1) {
    doSomething();
  }
}