Sonarqube "Use try-with-resources or close this "结果集的误报" in a "最终" clause"



Sonarqube一直在用这个问题标记代码,在我看来,这是一个误报。 代码如下所示:

try(PreparedStatement st=con.prepareStatement(myQuery)){
st.setInt(1, myValue);
...
ResultSet rs = st.executeQuery();
...
}

如果我没记错的话,PreparedStatement 实现了 Closeable,并且在关闭自身时,它还关闭了底层 ResultSet。

这种行为会阻止结果集保持打开状态,但 Sonarqube 分析将其标记为严重错误。

我弄错了吗?在这种情况下,有什么方法可以让Sonarqube忽略这个规则吗?

在 Sonarqube 6.7.3 和 JDK 8 下测试。

从 javadocResultSet

当生成 ResultSet 对象的语句对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,该对象将自动关闭。

事实上,这是一个误报。它已经被报告了,并且有开放的票证可以修复它 https://jira.sonarsource.com/browse/SONARJAVA-2060

您可以在SonarQube UI中将问题标记为误报,或者在提出问题的行上添加// NOSONAR注释以忽略它。

期望代码分析器知道这些事情可能是不合理的。 一个工具可以随时随地知道所有库中所有可关闭对象的所有附加语义吗?

文档确实提到"当前的结果集(如果有的话(也已关闭"。

注意"当前"。 如果你碰巧有两个不同的 executeQuery(( 调用会发生什么? 它会在不良状态或类似状态下失败吗? 是否会有两个不同的 ResultSet 对象,两个对象都未关闭,其中一个现在未引用?

(注意:两个不同的executeQuery((调用可能听起来完全疯狂,但请记住"编码人员可以做任何事情",这甚至就是为什么像SonarQube这样的工具首先被编写的原因。

我并不是说这是完全无可争议的,但对我来说,如果分析工具只是看到你得到一个可关闭的而不是关闭它,只是简单地抱怨它,这似乎并不奇怪。

Sonarqube团队最终修复了这个问题,从6.7版本开始。

pom.xml文件中没有属性文件或任何配置

请查看此文档,您可以在根项目目录中创建sonar-project.properties文件,设置许多不同的属性,这些属性对您的分析有影响。其中之一是sonar.java.source,它允许您特定的 concreate java 版本。(详情(

任何使Sonarqube忽略此规则的方法 情况 下?

我遇到过 sonarqube 引擎将代码块标记为问题的情况,但从开发人员的角度来看并非如此,因此在这种情况下,将其标记为误报是候选的。要设置允许/禁止在特定文件上标记问题的规则,请参阅此 sonarqube 文档 。

最新更新