diff options
Diffstat (limited to 'gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp')
-rw-r--r-- | gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp b/gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp index 90493da7e03..2180f920408 100644 --- a/gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp +++ b/gnu/llvm/compiler-rt/lib/gwp_asan/random.cpp @@ -7,14 +7,22 @@ //===----------------------------------------------------------------------===// #include "gwp_asan/random.h" -#include "gwp_asan/guarded_pool_allocator.h" +#include "gwp_asan/common.h" #include <time.h> +// Initialised to a magic constant so that an uninitialised GWP-ASan won't +// regenerate its sample counter for as long as possible. The xorshift32() +// algorithm used below results in getRandomUnsigned32(0xff82eb50) == +// 0xfffffea4. +GWP_ASAN_TLS_INITIAL_EXEC uint32_t RandomState = 0xff82eb50; + namespace gwp_asan { +void initPRNG() { + RandomState = time(nullptr) + getThreadID(); +} + uint32_t getRandomUnsigned32() { - thread_local uint32_t RandomState = - time(nullptr) + GuardedPoolAllocator::getThreadID(); RandomState ^= RandomState << 13; RandomState ^= RandomState >> 17; RandomState ^= RandomState << 5; |