You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Fortify将该代码标记为未释放同步资源?技术疑问求助

解决Fortify误报「Unreleased Resource: Synchronization」的问题

这确实是Fortify静态分析的一个常见误报,和你猜测的完全一致——问题出在lock字段声明为接口类型ReadWriteLock,而非具体的实现类ReentrantReadWriteLock。

先贴出你的代码方便参考:

class Foo { 
    final ReadWriteLock lock = new ReentrantReadWriteLock(); 
    Object read() { 
        lock.readLock().lock(); 
        Object result; 
        try { 
            result = getResource(); 
        } finally { 
            lock.readLock().unlock(); 
        } 
        return result; 
    } 
}

为什么会出现误报?

Fortify的静态分析逻辑比较保守:对于接口类型的ReadWriteLock,它无法确定所有实现类的readLock()方法都会返回同一个锁实例。虽然ReentrantReadWriteLock的readLock()确实会返回同一个对象,但工具不会默认所有接口实现都遵循这个规则。因此它会误判lock.readLock().unlock()并没有释放之前获取的那个锁,从而抛出「未释放同步资源」的告警。

几种可行的解决办法

  • 将锁字段改为具体实现类
    把字段类型从ReadWriteLock改成ReentrantReadWriteLock,让Fortify能明确识别锁的具体实现,从而正确追踪锁的获取和释放配对:

    class Foo { 
        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); 
        Object read() { 
            lock.readLock().lock(); 
            Object result; 
            try { 
                result = getResource(); 
            } finally { 
                lock.readLock().unlock(); 
            } 
            return result; 
        } 
    }
    
  • 显式缓存ReadLock实例
    如果不想修改字段的接口类型,可以把readLock()的返回值缓存到局部变量中,让工具清晰看到获取和释放的是同一个锁对象:

    class Foo { 
        final ReadWriteLock lock = new ReentrantReadWriteLock(); 
        Object read() { 
            Lock readLock = lock.readLock();
            readLock.lock(); 
            Object result; 
            try { 
                result = getResource(); 
            } finally { 
                readLock.unlock(); 
            } 
            return result; 
        } 
    }
    
  • 添加Fortify抑制注释
    如果上述两种方案都不符合你的代码规范,可以直接给方法添加抑制注释,告诉Fortify这是误报(具体注释语法可能需要匹配你的Fortify版本,以下是通用写法):

    class Foo { 
        final ReadWriteLock lock = new ReentrantReadWriteLock(); 
        // Fortify误报:锁已在finally块中正确释放
        @SuppressWarnings("fortify:UnreleasedResource")
        Object read() { 
            lock.readLock().lock(); 
            Object result; 
            try { 
                result = getResource(); 
            } finally { 
                lock.readLock().unlock(); 
            } 
            return result; 
        } 
    }
    

内容的提问来源于stack exchange,提问作者Nick Lowery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:08:41