Skip to content

Commit

Permalink
[analyzer] Fix pthread lock tests so that the API comes from a system…
Browse files Browse the repository at this point in the history
… 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
  • Loading branch information
jrose-apple committed Sep 10, 2014
1 parent c661f60 commit c279e01
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 23 deletions.
28 changes: 28 additions & 0 deletions test/Analysis/Inputs/system-header-simulator-for-pthread-lock.h
Original file line number Diff line number Diff line change
@@ -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);
40 changes: 17 additions & 23 deletions test/Analysis/pthreadlock.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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)
{
Expand Down

0 comments on commit c279e01

Please sign in to comment.