Java: handle lock state check stored in variable

This commit is contained in:
Jami Cogswell
2025-02-28 13:55:43 -05:00
parent 2f2c9f8943
commit fbf7513f37
3 changed files with 57 additions and 10 deletions

View File

@@ -3,3 +3,4 @@
| UnreleasedLock.java:40:3:40:15 | lock(...) | This lock might not be unlocked or might be locked more times than it is unlocked. |
| UnreleasedLock.java:50:3:50:15 | lock(...) | This lock might not be unlocked or might be locked more times than it is unlocked. |
| UnreleasedLock.java:72:8:72:23 | tryLock(...) | This lock might not be unlocked or might be locked more times than it is unlocked. |
| UnreleasedLock.java:114:13:114:28 | tryLock(...) | This lock might not be unlocked or might be locked more times than it is unlocked. |

View File

@@ -5,18 +5,18 @@ class Test {
void unlock() { }
boolean isHeldByCurrentThread() { return true; }
}
void f() throws RuntimeException { }
void g() throws RuntimeException { }
MyLock mylock = new MyLock();
void bad1() {
mylock.lock();
f();
mylock.unlock();
}
void good2() {
mylock.lock();
try {
@@ -25,7 +25,7 @@ class Test {
mylock.unlock();
}
}
void bad3() {
mylock.lock();
f();
@@ -35,7 +35,7 @@ class Test {
mylock.unlock();
}
}
void bad4() {
mylock.lock();
try {
@@ -45,7 +45,7 @@ class Test {
mylock.unlock();
}
}
void bad5(boolean lockmore) {
mylock.lock();
try {
@@ -58,7 +58,7 @@ class Test {
mylock.unlock();
}
}
void good6() {
if (!mylock.tryLock()) { return; }
try {
@@ -67,7 +67,7 @@ class Test {
mylock.unlock();
}
}
void bad7() {
if (!mylock.tryLock()) { return; }
f();
@@ -95,4 +95,29 @@ class Test {
mylock.unlock();
}
}
void good9() {
boolean locked = false;
try {
locked = mylock.tryLock();
if (!locked) { return; }
} finally {
if (locked) {
mylock.unlock();
}
}
}
void bad10() {
boolean locked = false;
try {
locked = mylock.tryLock();
if (!locked) { return; }
} finally {
if (locked) {
g();
mylock.unlock();
}
}
}
}