summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/pthreadlock.c
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2014-04-01 03:40:53 +0000
committerJordan Rose <jordan_rose@apple.com>2014-04-01 03:40:53 +0000
commit3a176ed16d65e1ae08daa42e7145581817faebfa (patch)
treece376542358d1f0d58c9e045094bbe7ea9bf7f1b /clang/test/Analysis/pthreadlock.c
parent7fcaa14a82960c7e33a0c7aba881f32d18060b0c (diff)
downloadbcm5719-llvm-3a176ed16d65e1ae08daa42e7145581817faebfa.tar.gz
bcm5719-llvm-3a176ed16d65e1ae08daa42e7145581817faebfa.zip
[analyzer] Lock checker: Allow pthread_mutex_init to reinitialize a destroyed lock.
Patch by Daniel Fahlgren! llvm-svn: 205276
Diffstat (limited to 'clang/test/Analysis/pthreadlock.c')
-rw-r--r--clang/test/Analysis/pthreadlock.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/clang/test/Analysis/pthreadlock.c b/clang/test/Analysis/pthreadlock.c
index 6a75a6e480e..2a59e0ffe98 100644
--- a/clang/test/Analysis/pthreadlock.c
+++ b/clang/test/Analysis/pthreadlock.c
@@ -8,6 +8,10 @@ typedef struct {
typedef struct {
void *foo;
+} pthread_mutexattr_t;
+
+typedef struct {
+ void *foo;
} lck_grp_t;
typedef pthread_mutex_t lck_mtx_t;
@@ -16,6 +20,7 @@ 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 *);
@@ -25,6 +30,8 @@ pthread_mutex_t mtx1, mtx2;
lck_mtx_t lck1, lck2;
lck_grp_t grp1;
+#define NULL 0
+
void
ok1(void)
{
@@ -138,6 +145,45 @@ ok15(void)
}
void
+ok16(void)
+{
+ pthread_mutex_init(&mtx1, NULL); // no-warning
+}
+
+void
+ok17(void)
+{
+ pthread_mutex_init(&mtx1, NULL); // no-warning
+ pthread_mutex_init(&mtx2, NULL); // no-warning
+}
+
+void
+ok18(void)
+{
+ pthread_mutex_destroy(&mtx1); // no-warning
+ pthread_mutex_init(&mtx1, NULL); // no-warning
+}
+
+void
+ok19(void)
+{
+ pthread_mutex_destroy(&mtx1); // no-warning
+ pthread_mutex_init(&mtx1, NULL); // no-warning
+ pthread_mutex_destroy(&mtx2); // no-warning
+ pthread_mutex_init(&mtx2, NULL); // no-warning
+}
+
+void
+ok20(void)
+{
+ pthread_mutex_unlock(&mtx1); // no-warning
+ pthread_mutex_destroy(&mtx1); // no-warning
+ pthread_mutex_init(&mtx1, NULL); // no-warning
+ pthread_mutex_destroy(&mtx1); // no-warning
+ pthread_mutex_init(&mtx1, NULL); // no-warning
+}
+
+void
bad1(void)
{
pthread_mutex_lock(&mtx1); // no-warning
@@ -331,3 +377,24 @@ bad23(void)
lck_mtx_lock(&mtx1); // no-warning
lck_mtx_destroy(&mtx1, &grp1); // expected-warning{{This lock is still locked}}
}
+
+void
+bad24(void)
+{
+ pthread_mutex_init(&mtx1, NULL); // no-warning
+ pthread_mutex_init(&mtx1, NULL); // expected-warning{{This lock has already been initialized}}
+}
+
+void
+bad25(void)
+{
+ pthread_mutex_lock(&mtx1); // no-warning
+ pthread_mutex_init(&mtx1, NULL); // expected-warning{{This lock is still being held}}
+}
+
+void
+bad26(void)
+{
+ pthread_mutex_unlock(&mtx1); // no-warning
+ pthread_mutex_init(&mtx1, NULL); // expected-warning{{This lock has already been initialized}}
+}
OpenPOWER on IntegriCloud