mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-26 13:26:22 +00:00
tsan: improve "destroy of a locked mutex" reports
1. Allow to suppress by current stack. We generally allow to suppress by all main stacks. Current is probably the stack one wants to use to suppress such reports. 2. Fix last lock stack restoration. We trimmed shadow value by storing it in u32. This magically worked for the test that provoked the report on the main thread. But this breaks for locks in any other threads. llvm-svn: 331023
This commit is contained in:
parent
1956a48d27
commit
21dc68fe7b
@ -104,7 +104,7 @@ void MutexDestroy(ThreadState *thr, uptr pc, uptr addr, u32 flagz) {
|
||||
unlock_locked = true;
|
||||
}
|
||||
u64 mid = s->GetId();
|
||||
u32 last_lock = s->last_lock;
|
||||
u64 last_lock = s->last_lock;
|
||||
if (!unlock_locked)
|
||||
s->Reset(thr->proc()); // must not reset it before the report is printed
|
||||
s->mtx.Unlock();
|
||||
@ -114,7 +114,7 @@ void MutexDestroy(ThreadState *thr, uptr pc, uptr addr, u32 flagz) {
|
||||
rep.AddMutex(mid);
|
||||
VarSizeStackTrace trace;
|
||||
ObtainCurrentStack(thr, pc, &trace);
|
||||
rep.AddStack(trace);
|
||||
rep.AddStack(trace, true);
|
||||
FastState last(last_lock);
|
||||
RestoreStack(last.tid(), last.epoch(), &trace, 0);
|
||||
rep.AddStack(trace, true);
|
||||
|
29
compiler-rt/test/tsan/mutex_destroy_locked2.cc
Normal file
29
compiler-rt/test/tsan/mutex_destroy_locked2.cc
Normal file
@ -0,0 +1,29 @@
|
||||
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
|
||||
void *thread(void *arg) {
|
||||
pthread_mutex_t m;
|
||||
pthread_mutex_init(&m, 0);
|
||||
pthread_mutex_lock(&m);
|
||||
pthread_mutex_destroy(&m);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main() {
|
||||
pthread_t th;
|
||||
pthread_create(&th, 0, thread, 0);
|
||||
pthread_join(th, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// CHECK: WARNING: ThreadSanitizer: destroy of a locked mutex
|
||||
// CHECK: #0 pthread_mutex_destroy
|
||||
// CHECK: #1 thread
|
||||
// CHECK: and:
|
||||
// CHECK: #0 pthread_mutex_lock
|
||||
// CHECK: #1 thread
|
||||
// CHECK: Mutex {{.*}} created at:
|
||||
// CHECK: #0 pthread_mutex_init
|
||||
// CHECK: #1 thread
|
||||
// CHECK: SUMMARY: ThreadSanitizer: destroy of a locked mutex {{.*}} in thread
|
19
compiler-rt/test/tsan/suppressions_mutex.cc
Normal file
19
compiler-rt/test/tsan/suppressions_mutex.cc
Normal file
@ -0,0 +1,19 @@
|
||||
// RUN: %clang_tsan -O1 %s -o %t && %env_tsan_opts=suppressions='%s.supp' %run %t 2>&1 | FileCheck %s
|
||||
#include "test.h"
|
||||
|
||||
void __attribute__((noinline)) suppress_this(pthread_mutex_t *mu) {
|
||||
pthread_mutex_destroy(mu);
|
||||
}
|
||||
|
||||
int main() {
|
||||
pthread_mutex_t mu;
|
||||
pthread_mutex_init(&mu, 0);
|
||||
pthread_mutex_lock(&mu);
|
||||
suppress_this(&mu);
|
||||
fprintf(stderr, "DONE\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// CHECK-NOT: failed to open suppressions file
|
||||
// CHECK-NOT: WARNING: ThreadSanitizer:
|
||||
// CHECK: DONE
|
2
compiler-rt/test/tsan/suppressions_mutex.cc.supp
Normal file
2
compiler-rt/test/tsan/suppressions_mutex.cc.supp
Normal file
@ -0,0 +1,2 @@
|
||||
mutex:suppress_this
|
||||
|
Loading…
x
Reference in New Issue
Block a user