У меня есть класс, который выглядит так:
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
поэтому потерян и просочился. Это правильно?
Не то чтобы я мог видеть. Я собираюсь сохранить блокировку в последней локальной переменной и посмотреть, разрешит ли это ее после нашего следующего сканирования.
Обязательно обязательно ответьте самостоятельно, если это решит. (А почему Lock
не AutoCloseable
?!)
Моя догадка была правильной. Fortify не мог сказать, что lock.readLock()
вернул один и тот же объект Lock
для обоих вызовов, и сохранение блокировки в локальной переменной final
решило проблему.
Это мое предположение. Есть ли причина не сохранять его в переменной?