【问题标题】:Sonarqube squid:S2095 false positiveSonarqube 鱿鱼:S2095 误报
【发布时间】:2016-08-03 01:38:29
【问题描述】:

在我们的代码库中,我们收到 Sonar 报告违反规则 squid:S2095 的代码如下:

    PreparedStatement ps = null;
    try {
        ps = connection.prepareStatement(DML); 
        ps.setString(1, externalDeviceId);
        ps.setInt(2, internalDeviceId);
        ps.execute();
        return ps.getUpdateCount() > 0;
    } finally {
        Utilities.close(ps);
    }

Utilities.close 实现为

    public static final void close(final AutoCloseable ac) {
        if(ac != null) {
            try {
                ac.close(); 
                } catch(Exception e) {
            }
        }
    }

有没有办法避免这些误报?

【问题讨论】:

  • 你使用的是哪个版本的java插件?
  • java插件版本为3.11
  • 在 3.12 期间对此进行了一些改进,并且很快就会发布 3.13。我建议您至少尝试使用 3.12 版以从此修复中受益:jira.sonarsource.com/browse/SONARJAVA-1538
  • 使用 //NOSONAR 注释

标签: java sonarqube false-positive


【解决方案1】:

如果您使用 Java 7+,则有一种非常简单的方法可以使用 try-with-resources 来关闭资源本身,您无需再关心它。见尝试(PreparedStatement ps = connection.prepareStatement(DML)),教程:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

try (PreparedStatement ps = connection.prepareStatement(DML)) {
    ps.setString(1, externalDeviceId);
    ps.setInt(2, internalDeviceId);
    ps.execute();
    return ps.getUpdateCount() > 0;
}

【讨论】:

    【解决方案2】:

    简短的回答,暂时没有办法避免这些。

    更长的答案: 通常,将打开的值传递给方法应将其标记为关闭以避免误报。您应该精确您正在使用的声纳 java 插件版本。

    此规则依赖于符号执行引擎,并且仅限于方法的边界,因此,目前无法确定调用此实用程序方法是否肯定会关闭打开的资源。

    但请注意,声纳 Java 团队正在努力消除此限制。

    【讨论】:

    • 这对用户不可用,在分析过程中值是打开/关闭的。不过,您可以在 SonarQube 界面中将问题标记为误报。
    • 我知道,但是我在我们的代码库中报告了 200 多个违反规则 squid:S2095 的行为,因为这种模式在很多地方都使用过。我担心的是我们可能有一些隐藏在噪音中的真正问题
    • 先尝试升级,然后你最好在java 7中使用try with resource。
    猜你喜欢
    • 2016-04-23
    • 2019-07-01
    • 1970-01-01
    • 2019-06-30
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2014-04-17
    相关资源
    最近更新 更多