Sonar,S128:switch语句的每个case都应该以无条件的"break"语句结束 VS "continue"

5

规则Squid:128似乎存在是为了防止在switch case语句中发生穿透现象,除非明确说明。这似乎是一个合理的规则,因为忘记break是一个常见的错误。

然而,当需要时,穿透现象是完全有效的。

该规则的文档说明了实现穿透现象的唯一方法是使用continue。

   case 4:                                // Use of continue statement
   continue;

我也检查了SwitchCaseWithoutBreakCheck的源代码,确实检查了"continue"语句的实现

  @Override
  public void visitContinueStatement(ContinueStatementTree tree) {
    super.visitContinueStatement(tree);
    markSwitchCasesAsCompliant();
  }

然而,Java语言不支持在switch/case中使用continue。在线文档和./java-checks/src/test/files/checks/SwitchCaseWithoutBreakCheck.java都不是有效的Java程序。
我是否漏掉了什么,还是这个规则完全失效并且防止使用穿透?
1个回答

3
您说得很对,这里的描述是错误的,如果您想要使用fallthrough并且不想触发规则,则实际上没有办法避免触发规则(因此您可能希望在这种情况下将问题标记为误报或完全禁用该规则)。
称呼规则为“损坏”的是一种观点,所以我不会对此进行争论;)
尽管如此,已创建一个工单来处理此问题:http://jira.sonarsource.com/browse/SONARJAVA-1169

感谢您创建这个工单。我认为允许或禁止fallthrough是主观的。然而,如果S128的目的是禁止fallthrough,我认为文档应该更清楚地说明。如果不是,那么能够明确声明给定的fallthrough是有意的将是很好的(我记得在某个时候可以使用特定的尾注释)。禁用规则和将问题标记为误报都无法使读者明确了解fallthrough。[注意:我更愿意直接在Jira上做出贡献,但似乎无法创建帐户] - Clément MATHIEU
那么,我们如何实现所需的 /* FALLTHROUGH */(用于 C 语法的 lint)呢? - mirabilos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接