fortify 抱怨 try-with-resources 块中的资源
Posted
技术标签:
【中文标题】fortify 抱怨 try-with-resources 块中的资源【英文标题】:fortify complains about resource in try-with-resources block 【发布时间】:2018-06-27 21:17:40 【问题描述】:我有一个 try-with-resources 块,它启动了一些可自动关闭的对象
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("some-file), "UTF-8")))
......
catch (IOException e)
.....
Fortify 扫描报告此问题
函数 ... in ... 有时 无法释放 FileInputStream() 分配的系统资源 行....
我想知道上面的代码有什么问题。我认为 try-with-resources 可以处理多个自动关闭的对象。任何想法是什么问题?谢谢。
【问题讨论】:
【参考方案1】:当然 Fortify 会抱怨它不应该抱怨的事情(误报),但上面的代码实际上可能会泄漏 FileInputStream 对象。考虑一下如果 InputStreamReader 构造函数抛出异常会发生什么。在这种情况下,我们当然已经创建了 FileInputStream,但它不会被清理。
您似乎认为在实现 AutoCloseable 的表达式中遇到的每个对象都将由 try-with-resources 语句管理。但是,如果您查看语言规范:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
try (VariableModifier R Identifier = Expression ...)
Block
翻译成:
final VariableModifierNoFinal R Identifier = Expression;
Throwable #primaryExc = null;
...
因此,只有表达式的“最终结果”(在您的情况下为 BufferedReader)会自动关闭。 (通常,组合流/读取器/写入器沿链传播关闭操作,但请记住,我们的前提是其中一个构造函数因异常而失败。)
您可以通过为链中的每个元素声明单独的变量来解决编码问题:
try (FileInputStream fis = new FileInputStream("some-file");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(isr))
//...
Fortify security issue "Unreleased resource stream" for try-with-resource 或多或少是相同的示例。
【讨论】:
以上是关于fortify 抱怨 try-with-resources 块中的资源的主要内容,如果未能解决你的问题,请参考以下文章
将字段设置为 null 时的 Java Null 取消引用 - Fortify