diff options
Diffstat (limited to 'lib/sanitizer_common/tests/sanitizer_linux_test.cc')
-rw-r--r-- | lib/sanitizer_common/tests/sanitizer_linux_test.cc | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/sanitizer_common/tests/sanitizer_linux_test.cc b/lib/sanitizer_common/tests/sanitizer_linux_test.cc index 0560fb57b..9a3f9270d 100644 --- a/lib/sanitizer_common/tests/sanitizer_linux_test.cc +++ b/lib/sanitizer_common/tests/sanitizer_linux_test.cc @@ -18,6 +18,9 @@ #include "sanitizer_common/sanitizer_common.h" +#ifdef __x86_64__ +#include <asm/prctl.h> +#endif #include <pthread.h> #include <sched.h> #include <stdlib.h> @@ -25,6 +28,10 @@ #include <algorithm> #include <vector> +#ifdef __x86_64__ +extern "C" int arch_prctl(int code, __sanitizer::uptr *addr); +#endif + namespace __sanitizer { struct TidReporterArgument { @@ -194,6 +201,28 @@ TEST(SanitizerCommon, SetEnvTest) { EXPECT_EQ(0, getenv(kEnvName)); } +#ifdef __x86_64__ +// libpthread puts the thread descriptor (%fs:0x0) at the end of stack space. +void *thread_descriptor_test_func(void *arg) { + uptr fs; + arch_prctl(ARCH_GET_FS, &fs); + pthread_attr_t attr; + pthread_getattr_np(pthread_self(), &attr); + void *stackaddr; + uptr stacksize; + pthread_attr_getstack(&attr, &stackaddr, &stacksize); + return (void *)((uptr)stackaddr + stacksize - fs); +} + +TEST(SanitizerLinux, ThreadDescriptorSize) { + pthread_t tid; + void *result; + pthread_create(&tid, 0, thread_descriptor_test_func, 0); + ASSERT_EQ(0, pthread_join(tid, &result)); + EXPECT_EQ((uptr)result, ThreadDescriptorSize()); +} +#endif + } // namespace __sanitizer #endif // __linux__ |