@@ -87,82 +87,115 @@ class PthreadLockChecker : public Checker<check::PostCall, check::DeadSymbols,
87
87
CheckerKind CheckKind) const ;
88
88
CallDescriptionMap<FnCheck> PThreadCallbacks = {
89
89
// Init.
90
- {{{" pthread_mutex_init" }, 2 }, &PthreadLockChecker::InitAnyLock},
90
+ {{CDM::CLibrary, {" pthread_mutex_init" }, 2 },
91
+ &PthreadLockChecker::InitAnyLock},
91
92
// TODO: pthread_rwlock_init(2 arguments).
92
93
// TODO: lck_mtx_init(3 arguments).
93
94
// TODO: lck_mtx_alloc_init(2 arguments) => returns the mutex.
94
95
// TODO: lck_rw_init(3 arguments).
95
96
// TODO: lck_rw_alloc_init(2 arguments) => returns the mutex.
96
97
97
98
// 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},
104
111
105
112
// 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},
112
125
113
126
// 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},
120
139
121
140
// 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},
124
145
// TODO: pthread_rwlock_destroy(1 argument).
125
146
// TODO: lck_rw_destroy(2 arguments).
126
147
};
127
148
128
149
CallDescriptionMap<FnCheck> FuchsiaCallbacks = {
129
150
// Init.
130
- {{{" spin_lock_init" }, 1 }, &PthreadLockChecker::InitAnyLock},
151
+ {{CDM::CLibrary, {" spin_lock_init" }, 1 },
152
+ &PthreadLockChecker::InitAnyLock},
131
153
132
154
// 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 },
137
162
&PthreadLockChecker::AcquirePthreadLock},
138
163
139
164
// 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},
143
171
144
172
// 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},
148
179
};
149
180
150
181
CallDescriptionMap<FnCheck> C11Callbacks = {
151
182
// Init.
152
- {{{" mtx_init" }, 2 }, &PthreadLockChecker::InitAnyLock},
183
+ {{CDM::CLibrary, {" mtx_init" }, 2 }, &PthreadLockChecker::InitAnyLock},
153
184
154
185
// Acquire.
155
- {{{" mtx_lock" }, 1 }, &PthreadLockChecker::AcquirePthreadLock},
186
+ {{CDM::CLibrary, {" mtx_lock" }, 1 },
187
+ &PthreadLockChecker::AcquirePthreadLock},
156
188
157
189
// 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},
160
192
161
193
// Release.
162
- {{{" mtx_unlock" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
194
+ {{CDM::CLibrary, {" mtx_unlock" }, 1 }, &PthreadLockChecker::ReleaseAnyLock},
163
195
164
196
// Destroy
165
- {{{" mtx_destroy" }, 1 }, &PthreadLockChecker::DestroyPthreadLock},
197
+ {{CDM::CLibrary, {" mtx_destroy" }, 1 },
198
+ &PthreadLockChecker::DestroyPthreadLock},
166
199
};
167
200
168
201
ProgramStateRef resolvePossiblyDestroyedMutex (ProgramStateRef state,
@@ -258,13 +291,9 @@ REGISTER_MAP_WITH_PROGRAMSTATE(DestroyRetVal, const MemRegion *, SymbolRef)
258
291
259
292
void PthreadLockChecker::checkPostCall(const CallEvent &Call,
260
293
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?
265
294
// FIXME: Try to handle cases when the implementation was inlined rather
266
295
// than just giving up.
267
- if (!Call. isGlobalCFunction () || C.wasInlined )
296
+ if (C.wasInlined )
268
297
return ;
269
298
270
299
if (const FnCheck *Callback = PThreadCallbacks.lookup (Call))
0 commit comments