【问题标题】:Sonar seems to ignore variables set in catch block声纳似乎忽略了 catch 块中设置的变量
【发布时间】:2018-02-28 05:57:48
【问题描述】:

有谁知道为什么 SonarQube 在以下示例中检测到违反规则“条件执行的块应该是可访问的”(squid:S2583)?这是误报吗?

在这段Java代码中,读取一个文件,在读取输入流的过程中可能会出现一个EOFException(或多个)。因此,异常被捕获和处理,并设置一个标志来记住它发生了。但是,Sonar 没有考虑第一个 catch 块中的 exHappened = true; 行,并声称变量始终是 false

public static boolean doSomething() {
    boolean exHappened = false;
    try (DataInputStream s = new DataInputStream(new FileInputStream("test"))) {
        LOGGER.info("Doing something...");
    }
    catch (EOFException eof) {   // this Exception can definitely happen
        exHappened = true;
    }
    catch (IOException io) {
        LOGGER.error("sorry", io);
    }

    if (exHappened) {            // Sonar thinks this condition is always false
        return false;
    }
    else {
        return true;
    }
}

为了更清楚,在try { } 中添加throw new EOFException(),然后条件将始终为真,而 Sonar 仍然声称它始终为假...

(我使用的是 SonarQube 5.6.6 和 SonarJava 插件 4.13.0.11627)

【问题讨论】:

  • 根据sonarqube.org/community/feedback,SonarQube Google Group 是一个更好的报告错误的地方,他们的 JIRA 可能是最好的。
  • 你是对的。下次我将在 SonarQube Google Group 中发布有关可能误报的问题(顺便说一下,他们的 JIRA 是只读的)。
  • 您可以向 Google Group 或此处发布问题,这两个渠道均由社区监控。您使用的 SonarJava 插件和 SonarQube 的版本是什么?
  • 问题更新:SonarQube 5.6.6 和 SonarJava 插件 4.13.0.11627
  • 嗨@TiborBlenessy,有什么更新吗?

标签: java sonarqube sonarlint false-positive


【解决方案1】:

这似乎是在 SonarJava 中的数据流分析期间如何处理 catch 块的问题。 Catch 块捕获被调用方法的 throws 声明中声明的异常的子类型不被考虑,因此引擎永远不会看到对变量的分配。

我创建了以下票来解决这个问题https://jira.sonarsource.com/browse/SONARJAVA-2483

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多