为什么 Fortify 将其标记为未发布的资源?

Why is Fortify flagging this as an unreleased resource?

我有一个 class 看起来像这样:

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

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

Fortify 用 Unreleased Resource: Synchronization 标记方法 read,声称已获得锁,然后在不释放锁的情况下直接退出该方法。

我的直觉是,由于 lock 字段是接口类型 ReadWriteLock,Fortify 无法判断 lock.readLock() 是否保证与 return 相同Lock 两个调用的对象。因此,Fortify 发现我们锁定的 Lock 没有存储在局部变量中,它认为 Lock 因此丢失和泄漏。这是正确的吗?

我的预感是正确的。 Fortify 无法判断 lock.readLock() 为两次调用返回相同的 Lock 对象,将锁存储在 final 局部变量中解决了这个问题。