声纳似乎忽略了catch块中设置的变量

时间:2017-09-19 12:35:11

标签: java sonarqube sonarlint false-positive

有谁知道为什么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;
    }
}

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

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

1 个答案:

答案 0 :(得分:2)

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

我创建了以下故障单来解决此问题https://jira.sonarsource.com/browse/SONARJAVA-2483