From c279e010ec8cca2c7c748eb0db237f4a0b7d30c7 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Wed, 10 Sep 2014 16:17:42 +0000 Subject: [PATCH] [analyzer] Fix pthread lock tests so that the API comes from a system header. ...and verify that a global mutex in user code can be used without warnings. Patch by Aleksei Sidorin! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@217515 91177308-0d34-0410-b5e6-96231b3b80d8 --- ...system-header-simulator-for-pthread-lock.h | 28 +++++++++++++ test/Analysis/pthreadlock.c | 40 ++++++++----------- 2 files changed, 45 insertions(+), 23 deletions(-) create mode 100644 test/Analysis/Inputs/system-header-simulator-for-pthread-lock.h diff --git a/test/Analysis/Inputs/system-header-simulator-for-pthread-lock.h b/test/Analysis/Inputs/system-header-simulator-for-pthread-lock.h new file mode 100644 index 0000000000..b290ffe8d8 --- /dev/null +++ b/test/Analysis/Inputs/system-header-simulator-for-pthread-lock.h @@ -0,0 +1,28 @@ +// Like the compiler, the static analyzer treats some functions differently if +// they come from a system header -- for example, pthread_mutex* functions +// should not invalidate regions of their arguments. +#pragma clang system_header + +typedef struct { + void *foo; +} pthread_mutex_t; + +typedef struct { + void *foo; +} pthread_mutexattr_t; + +typedef struct { + void *foo; +} lck_grp_t; + +typedef pthread_mutex_t lck_mtx_t; + +extern int pthread_mutex_lock(pthread_mutex_t *); +extern int pthread_mutex_unlock(pthread_mutex_t *); +extern int pthread_mutex_trylock(pthread_mutex_t *); +extern int pthread_mutex_destroy(pthread_mutex_t *); +extern int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); +extern int lck_mtx_lock(lck_mtx_t *); +extern int lck_mtx_unlock(lck_mtx_t *); +extern int lck_mtx_try_lock(lck_mtx_t *); +extern void lck_mtx_destroy(lck_mtx_t *lck, lck_grp_t *grp); diff --git a/test/Analysis/pthreadlock.c b/test/Analysis/pthreadlock.c index 2a59e0ffe9..a6e29e78ff 100644 --- a/test/Analysis/pthreadlock.c +++ b/test/Analysis/pthreadlock.c @@ -2,31 +2,10 @@ // Tests performing normal locking patterns and wrong locking orders -typedef struct { - void *foo; -} pthread_mutex_t; - -typedef struct { - void *foo; -} pthread_mutexattr_t; - -typedef struct { - void *foo; -} lck_grp_t; - -typedef pthread_mutex_t lck_mtx_t; - -extern int pthread_mutex_lock(pthread_mutex_t *); -extern int pthread_mutex_unlock(pthread_mutex_t *); -extern int pthread_mutex_trylock(pthread_mutex_t *); -extern int pthread_mutex_destroy(pthread_mutex_t *); -extern int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); -extern int lck_mtx_lock(lck_mtx_t *); -extern int lck_mtx_unlock(lck_mtx_t *); -extern int lck_mtx_try_lock(lck_mtx_t *); -extern void lck_mtx_destroy(lck_mtx_t *lck, lck_grp_t *grp); +#include "Inputs/system-header-simulator-for-pthread-lock.h" pthread_mutex_t mtx1, mtx2; +pthread_mutex_t *pmtx; lck_mtx_t lck1, lck2; lck_grp_t grp1; @@ -183,6 +162,21 @@ ok20(void) pthread_mutex_init(&mtx1, NULL); // no-warning } +void +ok21(void) { + pthread_mutex_lock(pmtx); // no-warning + pthread_mutex_unlock(pmtx); // no-warning +} + +void +ok22(void) { + pthread_mutex_lock(pmtx); // no-warning + pthread_mutex_unlock(pmtx); // no-warning + pthread_mutex_lock(pmtx); // no-warning + pthread_mutex_unlock(pmtx); // no-warning +} + + void bad1(void) { -- 2.50.1