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();
}
}