bugprone-branch-clone

检查 if/else if/else 链中的重复分支,switch 语句中连续的重复分支以及条件运算符中相同真假分支。

if (test_value(x)) {
  y++;
  do_something(x, y);
} else {
  y++;
  do_something(x, y);
}

在这个简单的示例中(例如,可能由复制粘贴错误引起)thenelse 分支是相同的,并且代码等效于以下更短、更简洁的代码

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 语句不同,该检查不会检测条件运算符链。

注意:此检查还会报告在预处理后才变得相同的分支情况。