hicpp-multiway-paths-covered¶
此检查会发现代码路径未完全覆盖的情况。 此外,它建议在代码更清晰的情况下使用 if
而不是 switch
。 规则 6.1.2 和 规则 6.1.4 高完整性 C++ 编码标准得到执行。
if-else if
链缺少最终的 else
分支可能会导致程序执行意外,并且可能是逻辑错误的结果。 如果缺少的 else
分支是预期的,则可以使用带有说明性注释的空分支。 此警告在某些代码库中可能会很烦人,因此默认情况下它已禁用。
void f1() {
int i = determineTheNumber();
if(i > 0) {
// Some Calculation
} else if (i < 0) {
// Precondition violated or something else.
}
// ...
}
类似的论点适用于 switch
语句,这些语句没有覆盖所有可能的代码路径。
// The missing default branch might be a logical error. It can be kept empty
// if there is nothing to do, making it explicit.
void f2(int i) {
switch (i) {
case 0: // something
break;
case 1: // something else
break;
}
// All other numbers?
}
// Violates this rule as well, but already emits a compiler warning (-Wswitch).
enum Color { Red, Green, Blue, Yellow };
void f3(enum Color c) {
switch (c) {
case Red: // We can't drive for now.
break;
case Green: // We are allowed to drive.
break;
}
// Other cases missing
}
规则 6.1.4 要求每个 switch
语句至少有两个 case
标签,而不是一个 default 标签。 否则,switch
可以用 if
语句更好地表达。 没有标签的退化 switch
语句也会被捕获。
// Degenerated switch that could be better written as `if`
int i = 42;
switch(i) {
case 1: // do something here
default: // do something else here
}
// Should rather be the following:
if (i == 1) {
// do something here
}
else {
// do something here
}
// A completely degenerated switch will be diagnosed.
int i = 42;
switch(i) {}
选项¶
- WarnOnMissingElse¶
布尔标志,用于激活缺少
else
分支的警告。 默认值为 false。