[analyzer] PthreadLock: Add more XNU rwlock unlock functions.

Differential Revision: https://reviews.llvm.org/D37807
This commit is contained in:
Artem Dergachev 2020-01-24 17:53:52 +03:00
parent 80fd37f9d6
commit 15624a7bda
3 changed files with 26 additions and 0 deletions

View File

@ -135,6 +135,8 @@ void PthreadLockChecker::checkPostStmt(const CallExpr *CE,
else if (FName == "pthread_mutex_unlock" ||
FName == "pthread_rwlock_unlock" ||
FName == "lck_mtx_unlock" ||
FName == "lck_rw_unlock_exclusive" ||
FName == "lck_rw_unlock_shared" ||
FName == "lck_rw_done")
ReleaseLock(C, CE, C.getSVal(CE->getArg(0)));
else if (FName == "pthread_mutex_destroy")

View File

@ -15,6 +15,10 @@ typedef struct {
void *foo;
} lck_grp_t;
typedef struct {
void *foo;
} lck_rw_t;
typedef pthread_mutex_t lck_mtx_t;
extern int pthread_mutex_lock(pthread_mutex_t *);
@ -28,3 +32,8 @@ extern void lck_mtx_lock(lck_mtx_t *);
extern void lck_mtx_unlock(lck_mtx_t *);
extern boolean_t lck_mtx_try_lock(lck_mtx_t *);
extern void lck_mtx_destroy(lck_mtx_t *lck, lck_grp_t *grp);
extern void lck_rw_lock_exclusive(lck_rw_t *lck);
extern void lck_rw_unlock_exclusive(lck_rw_t *lck);
extern void lck_rw_lock_shared(lck_rw_t *lck);
extern void lck_rw_unlock_shared(lck_rw_t *lck);

View File

@ -8,6 +8,7 @@ pthread_mutex_t mtx1, mtx2;
pthread_mutex_t *pmtx;
lck_mtx_t lck1, lck2;
lck_grp_t grp1;
lck_rw_t rw;
#define NULL 0
@ -213,6 +214,13 @@ void ok28(void) {
}
}
void ok29(void) {
lck_rw_lock_shared(&rw);
lck_rw_unlock_shared(&rw);
lck_rw_lock_exclusive(&rw); // no-warning
lck_rw_unlock_exclusive(&rw); // no-warning
}
void
bad1(void)
{
@ -471,3 +479,10 @@ void bad31(void) {
if (ret != 0)
pthread_mutex_lock(&mtx1);
}
void bad32(void) {
lck_rw_lock_shared(&rw);
lck_rw_unlock_exclusive(&rw); // FIXME: warn - should be shared?
lck_rw_lock_exclusive(&rw);
lck_rw_unlock_shared(&rw); // FIXME: warn - should be exclusive?
}