为什么 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
局部变量中解决了这个问题。
我有一个 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
局部变量中解决了这个问题。