在下面的示例中,有谁知道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 { },条件将始终为true,而Sonar仍然声称其始终为false ...

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

最佳答案

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

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

关于java - Sonar 似乎忽略了catch块中设置的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46300600/

10-11 22:14