# V6115. Not all Closeable members are released inside the 'close' method.

Анализатор обнаружил в классе, реализующем интерфейс 'Closeable' (или 'AutoCloseable'), поля (ресурсы), которые также реализуют этот интерфейс, но не освобождаются в методе 'close' анализируемого класса.

    сlass A implements Closeable {

      private FileWriter resource;

      public A(String name) {
        resource = new FileWriter(name);
      }

      public void close() {
        // Не освобождается resource
      }
    }

В данном примере поле 'resource' было инициализировано, но внутри класса 'A' не было вызова 'close' для этого поля. Отсутствие вызова метода закрытия приводит к тому, что ресурс не будет освобожден, даже когда для объекта класса 'A' был вызван метод 'close'. Из-за этого может произойти нарушение логики работы программы. Например, если ресурс не будет освобожден, то из-за этого не получится получить доступ к нему из другой части кода.

Такая ошибка может сохраниться, даже если в одном из методов происходит закрытие ресурса:

    сlass A implements Closeable {

      private FileWriter resource;

      public A(String name) {
        resource = new FileWriter(name);
      }

      public void endWrite() {
        resource.close();
      }

      public void close() {
        // Не освобождается resource и не вызывается метод endWrite
      }
    }

Исправить подобную ситуацию можно несколькими способами. Одним из них является освобождение ресурса внутри метода 'close' анализируемого класса:

    сlass A implements Closeable {

      private FileWriter resource;

      public A(String name) {
        resource = new FileWriter(name);
      }

      public void close() {
        resource.close();
      }
    }

Другой вариант исправления — добавление вызова метода, в котором происходит закрытие ресурса в метод close:

    сlass A implements Closeable {

      private FileWriter resource;

      public A(String name) {
        resource = new FileWriter(name);
      }

      public void endWrite() {
        resource.close();
      }

      public void close() {
        endWrite();
      }
    }

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений [* см. примечание касательно языков C#, Java].

Данная диагностика классифицируется как:

CWE-404