Почему Fortify помечает это как невыпущенный ресурс? - PullRequest
0 голосов
/ 01 мая 2018

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

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, таким образом, теряется и утекает. Это правильно?

1 Ответ

0 голосов
/ 22 мая 2018

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

...