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

标签 java security synchronization locking 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 标记方法 readUnreleased Resource: Synchronization , 声称已获得锁,然后在不释放锁的情况下直接退出该方法。

我的预感是,自从 lock字段是接口(interface)类型 ReadWriteLock , Fortify 无法分辨 lock.readLock()保证返回相同的 Lock两个调用的对象。因此,Fortify 看到 Lock我们锁定的没有存储在局部变量中,它认为 Lock因此丢失和泄漏。这是正确的吗?

最佳答案

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

关于java - 为什么 Fortify 将其标记为未发布的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50121774/

相关文章:

java - 减少项目中日志库的数量

java - 使用 bouncycaSTLe/spongycaSTLe 读取加密私钥

java - Spring Boot 不需要 CSRF token

android - 蓝牙文件交换是否完全安全?

java - jsoup线程安全

c# - 跨网络的命名管道给出 "The user name or password is incorrect"

concurrency - 为什么 dining-philosopher 的监控解决方案没有死锁而是饥饿?

java - 您可以将同步成本推到一个线程上吗?

java - CAS(比较和交换)工作正常吗?

java - 如何将 JBoss 服务器绑定(bind)到您的 Web 应用程序?