mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 03:25:54 -04:00
[analyzer] PthreadLock: Add more XNU rwlock unlock functions.
Differential Revision: https://reviews.llvm.org/D37807
This commit is contained in:
parent
80fd37f9d6
commit
15624a7bda
@ -135,6 +135,8 @@ void PthreadLockChecker::checkPostStmt(const CallExpr *CE,
|
|||||||
else if (FName == "pthread_mutex_unlock" ||
|
else if (FName == "pthread_mutex_unlock" ||
|
||||||
FName == "pthread_rwlock_unlock" ||
|
FName == "pthread_rwlock_unlock" ||
|
||||||
FName == "lck_mtx_unlock" ||
|
FName == "lck_mtx_unlock" ||
|
||||||
|
FName == "lck_rw_unlock_exclusive" ||
|
||||||
|
FName == "lck_rw_unlock_shared" ||
|
||||||
FName == "lck_rw_done")
|
FName == "lck_rw_done")
|
||||||
ReleaseLock(C, CE, C.getSVal(CE->getArg(0)));
|
ReleaseLock(C, CE, C.getSVal(CE->getArg(0)));
|
||||||
else if (FName == "pthread_mutex_destroy")
|
else if (FName == "pthread_mutex_destroy")
|
||||||
|
@ -15,6 +15,10 @@ typedef struct {
|
|||||||
void *foo;
|
void *foo;
|
||||||
} lck_grp_t;
|
} lck_grp_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void *foo;
|
||||||
|
} lck_rw_t;
|
||||||
|
|
||||||
typedef pthread_mutex_t lck_mtx_t;
|
typedef pthread_mutex_t lck_mtx_t;
|
||||||
|
|
||||||
extern int pthread_mutex_lock(pthread_mutex_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 void lck_mtx_unlock(lck_mtx_t *);
|
||||||
extern boolean_t lck_mtx_try_lock(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_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);
|
||||||
|
@ -8,6 +8,7 @@ pthread_mutex_t mtx1, mtx2;
|
|||||||
pthread_mutex_t *pmtx;
|
pthread_mutex_t *pmtx;
|
||||||
lck_mtx_t lck1, lck2;
|
lck_mtx_t lck1, lck2;
|
||||||
lck_grp_t grp1;
|
lck_grp_t grp1;
|
||||||
|
lck_rw_t rw;
|
||||||
|
|
||||||
#define NULL 0
|
#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
|
void
|
||||||
bad1(void)
|
bad1(void)
|
||||||
{
|
{
|
||||||
@ -471,3 +479,10 @@ void bad31(void) {
|
|||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
pthread_mutex_lock(&mtx1);
|
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?
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user