【问题标题】:fortify complains about resource in try-with-resources blockfortify 抱怨 try-with-resources 块中的资源
【发布时间】: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 可以处理多个自动关闭的对象。任何想法是什么问题?谢谢。

【问题讨论】:

    标签: fortify 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 或多或少是相同的示例。

    【讨论】:

      猜你喜欢
      • 2017-08-03
      • 2013-09-12
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 2017-11-18
      • 2011-10-16
      • 2021-12-09
      相关资源
      最近更新 更多