Skip to content

Commit

Permalink
[sanitizer] Intercept __pthread_mutex_lock and __pthread_mutex_unlock
Browse files Browse the repository at this point in the history
Reviewers: eugenis, dvyukov

Subscribers: srhines, kubamracek, llvm-commits

Differential Revision: https://reviews.llvm.org/D46793

llvm-svn: 332268
  • Loading branch information
vitalybuka committed May 14, 2018
1 parent 5e0feea commit e5bd326
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 0 deletions.
18 changes: 18 additions & 0 deletions compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
Expand Up @@ -4054,6 +4054,22 @@ INTERCEPTOR(int, pthread_mutex_unlock, void *m) {
#define INIT_PTHREAD_MUTEX_UNLOCK
#endif

#if SANITIZER_INTERCEPT___PTHREAD_MUTEX
INTERCEPTOR(int, __pthread_mutex_lock, void *m)
ALIAS(WRAPPER_NAME(pthread_mutex_lock));

INTERCEPTOR(int, __pthread_mutex_unlock, void *m)
ALIAS(WRAPPER_NAME(pthread_mutex_unlock));

#define INIT___PTHREAD_MUTEX_LOCK \
COMMON_INTERCEPT_FUNCTION(__pthread_mutex_lock)
#define INIT___PTHREAD_MUTEX_UNLOCK \
COMMON_INTERCEPT_FUNCTION(__pthread_mutex_unlock)
#else
#define INIT___PTHREAD_MUTEX_LOCK
#define INIT___PTHREAD_MUTEX_UNLOCK
#endif

#if SANITIZER_INTERCEPT___LIBC_MUTEX
INTERCEPTOR(int, __libc_mutex_lock, void *m)
ALIAS(WRAPPER_NAME(pthread_mutex_lock));
Expand Down Expand Up @@ -7302,6 +7318,8 @@ static void InitializeCommonInterceptors() {
INIT__EXIT;
INIT_PTHREAD_MUTEX_LOCK;
INIT_PTHREAD_MUTEX_UNLOCK;
INIT___PTHREAD_MUTEX_LOCK;
INIT___PTHREAD_MUTEX_UNLOCK;
INIT___LIBC_MUTEX_LOCK;
INIT___LIBC_MUTEX_UNLOCK;
INIT___LIBC_THR_SETCANCELSTATE;
Expand Down
Expand Up @@ -365,6 +365,7 @@
(SI_LINUX || SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_MAC || SI_SOLARIS)

#define SANITIZER_INTERCEPT_PTHREAD_MUTEX SI_POSIX
#define SANITIZER_INTERCEPT___PTHREAD_MUTEX SI_LINUX_NOT_ANDROID
#define SANITIZER_INTERCEPT___LIBC_MUTEX SI_NETBSD
#define SANITIZER_INTERCEPT_PTHREAD_SETNAME_NP \
(SI_FREEBSD || SI_NETBSD || SI_OPENBSD || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
Expand Down
34 changes: 34 additions & 0 deletions compiler-rt/test/sanitizer_common/TestCases/Linux/pthread_mutex.cc
@@ -0,0 +1,34 @@
// RUN: %clangxx -O1 %s -o %t && %run %t
// RUN: %clangxx -O1 -DUSE_GLIBC %s -o %t && %run %t
// UNSUPPORTED: android

#include <pthread.h>

#ifdef USE_GLIBC
extern "C" int __pthread_mutex_lock(pthread_mutex_t *__mutex);
extern "C" int __pthread_mutex_unlock(pthread_mutex_t *__mutex);
#define LOCK __pthread_mutex_lock
#define UNLOCK __pthread_mutex_unlock
#else
#define LOCK pthread_mutex_lock
#define UNLOCK pthread_mutex_unlock
#endif

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
int x;

static void *Start(void *arg) {
LOCK(&m);
++x;
UNLOCK(&m);
return nullptr;
}

int main() {
pthread_t threads[2] = {};
for (pthread_t &t : threads)
pthread_create(&t, 0, &Start, 0);
for (pthread_t &t : threads)
pthread_join(t, 0);
return 0;
}

0 comments on commit e5bd326

Please sign in to comment.