forked from intel/llvm
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[sanitizer] Fix asserts in asan and tsan in pthread interceptors. (#7…
…5394) Calling one of pthread join/detach interceptor on an already joined/detached thread causes asserts such as: AddressSanitizer: CHECK failed: sanitizer_thread_arg_retval.cpp:56 "((t)) != (0)" (0x0, 0x0) (tid=1236094) #0 0x555555634f8b in __asan::CheckUnwind() compiler-rt/lib/asan/asan_rtl.cpp:69:3 #1 0x55555564e06e in __sanitizer::CheckFailed(char const*, int, char const*, unsigned long long, unsigned long long) compiler-rt/lib/sanitizer_common/sanitizer_termination.cpp:86:24 #2 0x5555556491df in __sanitizer::ThreadArgRetval::BeforeJoin(unsigned long) const compiler-rt/lib/sanitizer_common/sanitizer_thread_arg_retval.cpp:56:3 #3 0x5555556198ed in Join<___interceptor_pthread_tryjoin_np(void*, void**)::<lambda()> > compiler-rt/lib/asan/../sanitizer_common/sanitizer_thread_arg_retval.h:74:26 #4 0x5555556198ed in pthread_tryjoin_np compiler-rt/lib/asan/asan_interceptors.cpp:311:29 The assert are replaced by error codes.
- Loading branch information
Showing
5 changed files
with
79 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
47 changes: 47 additions & 0 deletions
47
compiler-rt/test/sanitizer_common/TestCases/Linux/pthread_join_invalid.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
// RUN: %clangxx -pthread %s -o %t | ||
|
||
// RUN: %env_tool_opts=detect_invalid_join=true not %run %t 0 2>&1 | FileCheck %s | ||
// RUN: %env_tool_opts=detect_invalid_join=true not %run %t 1 2>&1 | FileCheck %s | ||
// RUN: %env_tool_opts=detect_invalid_join=true not %run %t 2 2>&1 | FileCheck %s | ||
// RUN: %env_tool_opts=detect_invalid_join=true not %run %t 3 2>&1 | FileCheck %s --check-prefix=DETACH | ||
|
||
// REQUIRES: glibc && (asan || hwasan || lsan) | ||
|
||
#include <assert.h> | ||
#include <ctime> | ||
#include <errno.h> | ||
#include <pthread.h> | ||
#include <stdint.h> | ||
#include <stdlib.h> | ||
#include <unistd.h> | ||
|
||
static void *fn(void *args) { | ||
sleep(1); | ||
return nullptr; | ||
} | ||
|
||
int main(int argc, char **argv) { | ||
int n = atoi(argv[1]); | ||
pthread_t thread; | ||
assert(!pthread_create(&thread, nullptr, fn, nullptr)); | ||
void *res; | ||
if (n == 0) { | ||
while (pthread_tryjoin_np(thread, &res)) | ||
sleep(1); | ||
pthread_tryjoin_np(thread, &res); | ||
} else if (n == 1) { | ||
timespec tm = {0, 1}; | ||
while (pthread_timedjoin_np(thread, &res, &tm)) | ||
sleep(1); | ||
pthread_timedjoin_np(thread, &res, &tm); | ||
} else if (n == 2) { | ||
assert(!pthread_join(thread, &res)); | ||
pthread_join(thread, &res); | ||
} else if (n == 3) { | ||
assert(!pthread_detach(thread)); | ||
pthread_join(thread, &res); | ||
} | ||
// CHECK: Joining already joined thread | ||
// DETACH: Joining detached thread | ||
return 0; | ||
} |