【问题标题】:Sonarqube false positive for "Use try-with-resources or close this "ResultSet" in a "finally" clause"Sonarqube 误报“使用 try-with-resources 或在“finally”子句中关闭此“ResultSet””
【发布时间】:2019-03-31 05:41:24
【问题描述】:

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

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

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

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

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

在 Sonarqube 6.7.3 和 JDK 8 下测试。

来自ResultSetjavadoc:

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

【问题讨论】:

  • 提供您的声纳配置属性(sonar-project.properties 文件或 pom 中的属性,如果您使用的是 maven-plugin)可能在那个地方可能有问题。
  • pom.xml 文件中没有属性文件或任何配置

标签: java sonarqube false-positive


【解决方案1】:

确实这是一个误报。已经举报了,有修复的票https://jira.sonarsource.com/browse/SONARJAVA-2060

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

【讨论】:

    【解决方案2】:

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

    文档确实提到“当前的 ResultSet,如果有的话,也关闭了”。

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

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

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

    【讨论】:

    • 第二个“executeQuery”也将关闭前一个结果集,根据相同的文档(如果语句被重新执行)。在 Statement 关闭之后关闭的 ResultSet 是规范,因此每个 anylizer(和开发人员)都必须根据它进行开发。正如@tibor-blenessy 所提到的,有一个关于此的声纳库错误修复。
    • 那么这一点仍然存在:如果不是 PreparedStatement 和 ResultSet,而是 Foo 和 Bar(来自任何随机库/包 X),那么分析器如何知道 PreparedStatement 和ResultSet (即关闭一个与关闭另一个“捆绑在一起” - 请注意,仅在一个特定方向上)也将在 Foo 和 Bar 之间保持?
    • 我理解你的意思,但我认为不一样。库 X 不是为其创建声纳规则的标准语言的一部分。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      请看一下这个documentation,你可以在你的项目根目录中创建sonar-project.properties文件,设置很多不同的属性,这些属性会影响你的分析。其中之一是sonar.java.source,它允许您创建特定的 java 版本。 (details)

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

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

      【讨论】:

      • 将尝试设置 sonar.java.source。由于出现次数众多,因此无法选择误报方式。
      • 即使是声纳问题,您也可以像我上面提到的那样缩小焦点。
      • 据我所知没有这样的属性。你在哪里找到它?我认为这对解决 OP 问题没有帮助。
      • @KamilW。对不起,你是对的,我忘记了这个。但是,这不会改变此规则的任何内容,因为它不是特定于 Java 版本的
      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 2021-12-09
      • 2021-02-14
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2020-05-13
      • 2019-07-08
      相关资源
      最近更新 更多