bugprone-branch-clone¶
检查 if/else if/else
链中的重复分支,switch
语句中连续的重复分支以及条件运算符中相同真假分支。
if (test_value(x)) {
y++;
do_something(x, y);
} else {
y++;
do_something(x, y);
}
在这个简单的示例中(例如,可能由复制粘贴错误引起)then
和 else
分支是相同的,并且代码等效于以下更短、更简洁的代码
test_value(x); // can be omitted unless it has side effects
y++;
do_something(x, y);
如果这是预期的行为,那么没有理由使用条件语句;否则,可以通过修复处理不正确的分支来解决问题。
该检查还检测更长的 if/else if/else
链中的重复分支,在那里更难注意到问题。
在 switch
语句中,该检查仅在重复分支是连续的时候才会报告,因为 case:
标签通常具有一定的自然顺序,重新排列它们会降低代码的可读性。例如
switch (ch) {
case 'a':
return 10;
case 'A':
return 10;
case 'b':
return 11;
case 'B':
return 11;
default:
return 10;
}
这里,该检查报告 'a'
和 'A'
分支是相同的(并且 'b'
和 'B'
分支也是相同的),但没有报告 default:
分支也与前两个分支相同。如果这确实是正确的行为,那么它可以实现为
switch (ch) {
case 'a':
case 'A':
return 10;
case 'b':
case 'B':
return 11;
default:
return 10;
}
在这里,该检查没有针对重复的 return 10;
警告,如果我们想要保留 'a'
在 'b'
之前,并且 default:
是最后一个分支,那么这是好事。
带有 [[fallthrough]]
属性的 Switch case 会被忽略。
最后,该检查还检查条件运算符,并报告类似以下的代码
return test_value(x) ? x : x;
与 if 语句不同,该检查不会检测条件运算符链。
注意:此检查还会报告在预处理后才变得相同的分支情况。