@@ -87,82 +87,115 @@ class PthreadLockChecker : public Checker<check::PostCall, check::DeadSymbols,
8787 CheckerKind CheckKind) const ;
8888 CallDescriptionMap<FnCheck> PThreadCallbacks = {
8989 // Init.
90- {{{" pthread_mutex_init" }, 2 }, &PthreadLockChecker::InitAnyLock},
90+ {{CDM::CLibrary, {" pthread_mutex_init" }, 2 },
91+ &PthreadLockChecker::InitAnyLock},
9192 // TODO: pthread_rwlock_init(2 arguments).
9293 // TODO: lck_mtx_init(3 arguments).
9394 // TODO: lck_mtx_alloc_init(2 arguments) => returns the mutex.
9495 // TODO: lck_rw_init(3 arguments).
9596 // TODO: lck_rw_alloc_init(2 arguments) => returns the mutex.
9697
9798 // Acquire.
98- {{{" pthread_mutex_lock" }, 1 }, &PthreadLockChecker::AcquirePthreadLock},
99- {{{" pthread_rwlock_rdlock" }, 1 }, &PthreadLockChecker::AcquirePthreadLock},
100- {{{" pthread_rwlock_wrlock" }, 1 }, &PthreadLockChecker::AcquirePthreadLock},
101- {{{" lck_mtx_lock" }, 1 }, &PthreadLockChecker::AcquireXNULock},
102- {{{" lck_rw_lock_exclusive" }, 1 }, &PthreadLockChecker::AcquireXNULock},
103- {{{" lck_rw_lock_shared" }, 1 }, &PthreadLockChecker::AcquireXNULock},
99+ {{CDM::CLibrary, {" pthread_mutex_lock" }, 1 },
100+ &PthreadLockChecker::AcquirePthreadLock},
101+ {{CDM::CLibrary, {" pthread_rwlock_rdlock" }, 1 },
102+ &PthreadLockChecker::AcquirePthreadLock},
103+ {{CDM::CLibrary, {" pthread_rwlock_wrlock" }, 1 },
104+ &PthreadLockChecker::AcquirePthreadLock},
105+ {{CDM::CLibrary, {" lck_mtx_lock" }, 1 },
106+ &PthreadLockChecker::AcquireXNULock},
107+ {{CDM::CLibrary, {" lck_rw_lock_exclusive" }, 1 },
108+ &PthreadLockChecker::AcquireXNULock},
109+ {{CDM::CLibrary, {" lck_rw_lock_shared" }, 1 },
110+ &PthreadLockChecker::AcquireXNULock},
104111
105112 // Try.
106- {{{" pthread_mutex_trylock" }, 1 }, &PthreadLockChecker::TryPthreadLock},
107- {{{" pthread_rwlock_tryrdlock" }, 1 }, &PthreadLockChecker::TryPthreadLock},
108- {{{" pthread_rwlock_trywrlock" }, 1 }, &PthreadLockChecker::TryPthreadLock},
109- {{{" lck_mtx_try_lock" }, 1 }, &PthreadLockChecker::TryXNULock},
110- {{{" lck_rw_try_lock_exclusive" }, 1 }, &PthreadLockChecker::TryXNULock},
111- {{{" lck_rw_try_lock_shared" }, 1 }, &PthreadLockChecker::TryXNULock},
113+ {{CDM::CLibrary, {" pthread_mutex_trylock" }, 1 },
114+ &PthreadLockChecker::TryPthreadLock},
115+ {{CDM::CLibrary, {" pthread_rwlock_tryrdlock" }, 1 },
116+ &PthreadLockChecker::TryPthreadLock},
117+ {{CDM::CLibrary, {" pthread_rwlock_trywrlock" }, 1 },
118+ &PthreadLockChecker::TryPthreadLock},
119+ {{CDM::CLibrary, {" lck_mtx_try_lock" }, 1 },
120+ &PthreadLockChecker::TryXNULock},
121+ {{CDM::CLibrary, {" lck_rw_try_lock_exclusive" }, 1 },
122+ &PthreadLockChecker::TryXNULock},
123+ {{CDM::CLibrary, {" lck_rw_try_lock_shared" }, 1 },
124+ &PthreadLockChecker::TryXNULock},
112125
113126 // Release.
114- {{{" pthread_mutex_unlock" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
115- {{{" pthread_rwlock_unlock" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
116- {{{" lck_mtx_unlock" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
117- {{{" lck_rw_unlock_exclusive" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
118- {{{" lck_rw_unlock_shared" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
119- {{{" lck_rw_done" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
127+ {{CDM::CLibrary, {" pthread_mutex_unlock" }, 1 },
128+ &PthreadLockChecker::ReleaseAnyLock},
129+ {{CDM::CLibrary, {" pthread_rwlock_unlock" }, 1 },
130+ &PthreadLockChecker::ReleaseAnyLock},
131+ {{CDM::CLibrary, {" lck_mtx_unlock" }, 1 },
132+ &PthreadLockChecker::ReleaseAnyLock},
133+ {{CDM::CLibrary, {" lck_rw_unlock_exclusive" }, 1 },
134+ &PthreadLockChecker::ReleaseAnyLock},
135+ {{CDM::CLibrary, {" lck_rw_unlock_shared" }, 1 },
136+ &PthreadLockChecker::ReleaseAnyLock},
137+ {{CDM::CLibrary, {" lck_rw_done" }, 1 },
138+ &PthreadLockChecker::ReleaseAnyLock},
120139
121140 // Destroy.
122- {{{" pthread_mutex_destroy" }, 1 }, &PthreadLockChecker::DestroyPthreadLock},
123- {{{" lck_mtx_destroy" }, 2 }, &PthreadLockChecker::DestroyXNULock},
141+ {{CDM::CLibrary, {" pthread_mutex_destroy" }, 1 },
142+ &PthreadLockChecker::DestroyPthreadLock},
143+ {{CDM::CLibrary, {" lck_mtx_destroy" }, 2 },
144+ &PthreadLockChecker::DestroyXNULock},
124145 // TODO: pthread_rwlock_destroy(1 argument).
125146 // TODO: lck_rw_destroy(2 arguments).
126147 };
127148
128149 CallDescriptionMap<FnCheck> FuchsiaCallbacks = {
129150 // Init.
130- {{{" spin_lock_init" }, 1 }, &PthreadLockChecker::InitAnyLock},
151+ {{CDM::CLibrary, {" spin_lock_init" }, 1 },
152+ &PthreadLockChecker::InitAnyLock},
131153
132154 // Acquire.
133- {{{" spin_lock" }, 1 }, &PthreadLockChecker::AcquirePthreadLock},
134- {{{" spin_lock_save" }, 3 }, &PthreadLockChecker::AcquirePthreadLock},
135- {{{" sync_mutex_lock" }, 1 }, &PthreadLockChecker::AcquirePthreadLock},
136- {{{" sync_mutex_lock_with_waiter" }, 1 },
155+ {{CDM::CLibrary, {" spin_lock" }, 1 },
156+ &PthreadLockChecker::AcquirePthreadLock},
157+ {{CDM::CLibrary, {" spin_lock_save" }, 3 },
158+ &PthreadLockChecker::AcquirePthreadLock},
159+ {{CDM::CLibrary, {" sync_mutex_lock" }, 1 },
160+ &PthreadLockChecker::AcquirePthreadLock},
161+ {{CDM::CLibrary, {" sync_mutex_lock_with_waiter" }, 1 },
137162 &PthreadLockChecker::AcquirePthreadLock},
138163
139164 // Try.
140- {{{" spin_trylock" }, 1 }, &PthreadLockChecker::TryFuchsiaLock},
141- {{{" sync_mutex_trylock" }, 1 }, &PthreadLockChecker::TryFuchsiaLock},
142- {{{" sync_mutex_timedlock" }, 2 }, &PthreadLockChecker::TryFuchsiaLock},
165+ {{CDM::CLibrary, {" spin_trylock" }, 1 },
166+ &PthreadLockChecker::TryFuchsiaLock},
167+ {{CDM::CLibrary, {" sync_mutex_trylock" }, 1 },
168+ &PthreadLockChecker::TryFuchsiaLock},
169+ {{CDM::CLibrary, {" sync_mutex_timedlock" }, 2 },
170+ &PthreadLockChecker::TryFuchsiaLock},
143171
144172 // Release.
145- {{{" spin_unlock" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
146- {{{" spin_unlock_restore" }, 3 }, &PthreadLockChecker::ReleaseAnyLock},
147- {{{" sync_mutex_unlock" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
173+ {{CDM::CLibrary, {" spin_unlock" }, 1 },
174+ &PthreadLockChecker::ReleaseAnyLock},
175+ {{CDM::CLibrary, {" spin_unlock_restore" }, 3 },
176+ &PthreadLockChecker::ReleaseAnyLock},
177+ {{CDM::CLibrary, {" sync_mutex_unlock" }, 1 },
178+ &PthreadLockChecker::ReleaseAnyLock},
148179 };
149180
150181 CallDescriptionMap<FnCheck> C11Callbacks = {
151182 // Init.
152- {{{" mtx_init" }, 2 }, &PthreadLockChecker::InitAnyLock},
183+ {{CDM::CLibrary, {" mtx_init" }, 2 }, &PthreadLockChecker::InitAnyLock},
153184
154185 // Acquire.
155- {{{" mtx_lock" }, 1 }, &PthreadLockChecker::AcquirePthreadLock},
186+ {{CDM::CLibrary, {" mtx_lock" }, 1 },
187+ &PthreadLockChecker::AcquirePthreadLock},
156188
157189 // Try.
158- {{{" mtx_trylock" }, 1 }, &PthreadLockChecker::TryC11Lock},
159- {{{" mtx_timedlock" }, 2 }, &PthreadLockChecker::TryC11Lock},
190+ {{CDM::CLibrary, {" mtx_trylock" }, 1 }, &PthreadLockChecker::TryC11Lock},
191+ {{CDM::CLibrary, {" mtx_timedlock" }, 2 }, &PthreadLockChecker::TryC11Lock},
160192
161193 // Release.
162- {{{" mtx_unlock" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
194+ {{CDM::CLibrary, {" mtx_unlock" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
163195
164196 // Destroy
165- {{{" mtx_destroy" }, 1 }, &PthreadLockChecker::DestroyPthreadLock},
197+ {{CDM::CLibrary, {" mtx_destroy" }, 1 },
198+ &PthreadLockChecker::DestroyPthreadLock},
166199 };
167200
168201 ProgramStateRef resolvePossiblyDestroyedMutex (ProgramStateRef state,
@@ -258,13 +291,9 @@ REGISTER_MAP_WITH_PROGRAMSTATE(DestroyRetVal, const MemRegion *, SymbolRef)
258291
259292void PthreadLockChecker::checkPostCall(const CallEvent &Call,
260293 CheckerContext &C) const {
261- // An additional umbrella check that all functions modeled by this checker
262- // are global C functions.
263- // TODO: Maybe make this the default behavior of CallDescription
264- // with exactly one identifier?
265294 // FIXME: Try to handle cases when the implementation was inlined rather
266295 // than just giving up.
267- if (!Call. isGlobalCFunction () || C.wasInlined )
296+ if (C.wasInlined )
268297 return ;
269298
270299 if (const FnCheck *Callback = PThreadCallbacks.lookup (Call))
0 commit comments