【发布时间】:2016-03-12 10:02:45
【问题描述】:
我目前正在处理一个项目,该项目使用 HP 的 Fortify SCA 工具来捕获代码库中的安全问题。我在确定正确处理 JDBC 资源的最佳方法时遇到了一些问题。
我现在的代码是这样的;
try (Connection conn = new DatabaseService().getConnection();
PreparedStatement ps = conn.prepareStatement(query);) {
ps.setString(1, mString);
try (ResultSet rs = ps.executeQuery();) {
while (rs.next()) {
...Do logic...
}
} catch (SQLException e) {
e.printStackTrace();
}
} catch (SQLException e){
e.printStackTrace();
}
}
问题是 Fortify 会标记此代码,说明如果在嵌套的 try 语句中发生异常,则对 conn 和 ps 的引用将丢失,并且它们不会被正确关闭。强化标记是正确的还是误报?据我了解,try-with-resource 应该总是关闭他们的资源,但当他们像这样嵌套时,这可能并不总是发生。
我已经搜索了互联网上的其他相关问题和博客,但我无法获得任何明确的证据。
在这种情况下最安全的解决方案是不使用 try-with-resource 并在更广泛的 try-catch 语句的 catch 和 finally 块中使用 try-catch 包装每个资源。但是,我宁愿避免这样做,因为它非常冗长。
提前致谢!
编辑:所以我意识到当我将代码重写为 SO 时,我在代码中遗漏了一些东西。原始的 catch 块中有一个 System.exit(1); 语句(我知道这是不好的做法)。这意味着如果在嵌套的 try-with-resource 中引发异常,那么 Fortify 会正确地说 conn 和 ps 不会正确关闭。
感谢您的回复,如果没有System.exit(1);,在这种情况下所有资源将正确关闭,我选择了表明这一点的答案。
【问题讨论】:
-
这个 Fortify 工具是否甚至支持 Java 7 或更高版本,因为它的分析是错误的。
标签: jdbc fortify try-with-resources