Почему Fortify отмечает это как неизданный ресурс?

У меня есть класс, который выглядит так:

class Foo {
    final ReadWriteLock lock = new ReentrantReadWriteLock();

    Object read() {
        lock.readLock().lock();
        Object result;
        try {
            result = getResource();
        } finally {
            lock.readLock().unlock();
        }
        return result;
    }
}

Fortify помечает метод read с помощью Unreleased Resource: Synchronization, утверждая, что блокировка получена, а затем метод просто выходит сразу после этого без снятия блокировки.

Я догадываюсь, что, поскольку поле lock относится к типу интерфейса ReadWriteLock, Fortify не может сказать, что lock.readLock() гарантированно вернет один и тот же объект Lock для обоих вызовов. Итак, Fortify видит, что заблокированный нами Lock не хранится в локальной переменной, и считает, что Lock поэтому потерян и просочился. Это правильно?

Это мое предположение. Есть ли причина не сохранять его в переменной?

chrylis -cautiouslyoptimistic- 01.05.2018 20:34

Не то чтобы я мог видеть. Я собираюсь сохранить блокировку в последней локальной переменной и посмотреть, разрешит ли это ее после нашего следующего сканирования.

Nick Lowery 01.05.2018 20:38

Обязательно обязательно ответьте самостоятельно, если это решит. (А почему Lock не AutoCloseable ?!)

chrylis -cautiouslyoptimistic- 01.05.2018 20:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
1 811
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Моя догадка была правильной. Fortify не мог сказать, что lock.readLock() вернул один и тот же объект Lock для обоих вызовов, и сохранение блокировки в локальной переменной final решило проблему.

Другие вопросы по теме