为何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
相关产品推荐
相关产品推荐

