Java Sonarqube squid:S2095假阳性

Java Sonarqube squid:S2095假阳性,java,sonarqube,false-positive,Java,Sonarqube,False Positive,在我们的代码库中,我们得到Sonar报告,在代码中违反了squid:S2095规则,如下所示: PreparedStatement ps = null; try { ps = connection.prepareStatement(DML); ps.setString(1, externalDeviceId); ps.setInt(2, internalDeviceId); ps.execute();

在我们的代码库中,我们得到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) {
            }
        }
    }

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

简而言之,目前没有办法避免这些误报

详细回答: 通常,将打开的值传递给方法时应将其标记为关闭,以避免误报。您应该精确地确定正在使用的sonar java插件版本

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


但是请注意,sonar java团队正在努力消除这一限制

如果您使用Java 7+,有一种非常简单的方法可以使用try with resources来关闭资源本身,您不必再关心它了。请参阅try(PreparedStatement ps=connection.prepareStatement(DML)),教程:


您使用的是哪一版本的java插件?java插件版本是3.11。在3.12期间,这方面有了一些改进,3.13的发行版很快就会公开。我建议您尝试使用3.12版,至少可以从该修复程序中获益:使用//NOSONAR Comments这对用户不可用,在分析过程中会打开/关闭值。不过,您可以在SonarQube界面中将问题标记为假阳性。我知道,但我在我们的代码库中报告了200多起违反squid:S2095规则的事件,因为这种模式在5月份的地方使用。我担心的是,我们可能会在Noisery升级中隐藏一些真正的问题,那么您最好使用Java7的try with resource。
try (PreparedStatement ps = connection.prepareStatement(DML)) {
    ps.setString(1, externalDeviceId);
    ps.setInt(2, internalDeviceId);
    ps.execute();
    return ps.getUpdateCount() > 0;
}