Sonarqube鱿鱼:S2095假阳性

Mar*_*rto 5 java false-positive sonarqube

在我们的代码库中,我们得到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);
    }
Run Code Online (Sandbox Code Playgroud)

将Utilities.close实现为

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

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

ben*_*ico 3

简而言之,目前无法避免这些。

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

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

但请注意,sonar java 团队正在努力消除此限制。