声纳似乎忽略了 catch 块中设置的变量
Sonar seems to ignore variables set in catch block
有谁知道为什么 SonarQube 在以下示例中检测到违反规则 "Conditionally executed blocks should be reachable" (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()
,然后条件将 always 为真,Sonar 仍然声称它总是假的...
(我正在使用 SonarQube 5.6.6 和 SonarJava 插件 4.13.0.11627)
这似乎是在 SonarJava 中数据流分析期间如何处理 catch 块的问题。 Catch 块捕获在被调用方法的 throws 声明中声明的异常的子类型,因此引擎永远不会看到对变量的赋值。
我创建了以下工单来解决这个问题https://jira.sonarsource.com/browse/SONARJAVA-2483
有谁知道为什么 SonarQube 在以下示例中检测到违反规则 "Conditionally executed blocks should be reachable" (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()
,然后条件将 always 为真,Sonar 仍然声称它总是假的...
(我正在使用 SonarQube 5.6.6 和 SonarJava 插件 4.13.0.11627)
这似乎是在 SonarJava 中数据流分析期间如何处理 catch 块的问题。 Catch 块捕获在被调用方法的 throws 声明中声明的异常的子类型,因此引擎永远不会看到对变量的赋值。
我创建了以下工单来解决这个问题https://jira.sonarsource.com/browse/SONARJAVA-2483