@@ -4,39 +4,49 @@ module;
44import java
55import semmle.code.java.frameworks.Mockito
66
7+ /**
8+ * A Java type representing a lock.
9+ * We identify a lock type as one that has both `lock` and `unlock` methods.
10+ */
711class LockType extends RefType {
812 LockType() {
913 this.getAMethod().hasName("lock") and
1014 this.getAMethod().hasName("unlock")
1115 }
1216
17+ /** Gets a method that is locking this lock type. */
1318 Method getLockMethod() {
1419 result.getDeclaringType() = this and
1520 result.hasName(["lock", "lockInterruptibly", "tryLock"])
1621 }
1722
23+ /** Gets a method that is unlocking this lock type. */
1824 Method getUnlockMethod() {
1925 result.getDeclaringType() = this and
2026 result.hasName("unlock")
2127 }
2228
29+ /** Gets an `isHeldByCurrentThread` method of this lock type. */
2330 Method getIsHeldByCurrentThreadMethod() {
2431 result.getDeclaringType() = this and
2532 result.hasName("isHeldByCurrentThread")
2633 }
2734
35+ /** Gets a call to a method that is locking this lock type. */
2836 MethodCall getLockAccess() {
2937 result.getMethod() = this.getLockMethod() and
3038 // Not part of a Mockito verification call
3139 not result instanceof MockitoVerifiedMethodCall
3240 }
3341
42+ /** Gets a call to a method that is unlocking this lock type. */
3443 MethodCall getUnlockAccess() {
3544 result.getMethod() = this.getUnlockMethod() and
3645 // Not part of a Mockito verification call
3746 not result instanceof MockitoVerifiedMethodCall
3847 }
3948
49+ /** Gets a call to a method that checks if the lock is held by the current thread. */
4050 MethodCall getIsHeldByCurrentThreadAccess() {
4151 result.getMethod() = this.getIsHeldByCurrentThreadMethod() and
4252 // Not part of a Mockito verification call
@@ -200,9 +210,9 @@ module Monitors {
200210 exists(Variable localLock, MethodCall lockCall, MethodCall unlockCall |
201211 represents(lock, localLock) and
202212 lockCall.getQualifier() = localLock.getAnAccess() and
203- lockCall.getMethod() = lock.getType().(LockType).getLockMethod () and
213+ lockCall = lock.getType().(LockType).getLockAccess () and
204214 unlockCall.getQualifier() = localLock.getAnAccess() and
205- unlockCall.getMethod() = lock.getType().(LockType).getUnlockMethod ()
215+ unlockCall = lock.getType().(LockType).getUnlockAccess ()
206216 |
207217 dominates(lockCall.getControlFlowNode(), unlockCall.getControlFlowNode()) and
208218 dominates(lockCall.getControlFlowNode(), getNodeToBeDominated(e)) and
0 commit comments