未释放锁¶
ID: java/unreleased-lock
Kind: problem
Security severity: 5.0
Severity: error
Precision: medium
Tags:
- reliability
- security
- external/cwe/cwe-764
- external/cwe/cwe-833
Query suites:
- java-security-extended.qls
- java-security-and-quality.qls
当线程获取锁时,它必须确保再次解锁;未能这样做会导致死锁。如果锁允许线程多次获取它,例如 java.util.concurrent.locks.ReentrantLock
,则锁的数量必须与解锁的数量匹配才能完全释放锁。
建议¶
建议的做法是始终在调用 lock
后立即使用 try
块,并将调用 unlock
放置在 finally
块中。注意 finally
块中的调用可能会导致异常,因为这可能导致跳过对 unlock
的调用。
示例¶
安全使用锁的典型模式如下所示
public void m() {
lock.lock();
// A
try {
// ... method body
} finally {
// B
lock.unlock();
}
}
如果在 A
或 B
处插入任何可能导致方法过早退出的代码(例如通过抛出异常),则该方法可能无法解锁,因此应避免这样做。
参考¶
Java API 规范:java.util.concurrent.locks.Lock,java.util.concurrent.locks.ReentrantLock.
常见弱点枚举:CWE-764.
常见漏洞枚举:CWE-833.