[GWP-ASan] Add thread ID to PRNG seed.

Summary:
Adds thread ID to PRNG seed for increased entropy. In particular, this allows
multiple runs in quick succession that will have different PRNG seeds, allowing
for better demos/testing.

Reviewers: kcc

Reviewed By: kcc

Subscribers: kubamracek, #sanitizers, llvm-commits

Tags: #sanitizers, #llvm

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

llvm-svn: 366253
This commit is contained in:
Mitch Phillips 2019-07-16 20:06:17 +00:00
parent 6e0fa292c2
commit b157dcacb5
2 changed files with 7 additions and 5 deletions

View File

@ -132,6 +132,10 @@ public:
// occur.
static void reportError(uintptr_t AccessPtr, Error E = Error::UNKNOWN);
// Get the current thread ID, or kInvalidThreadID if failure. Note: This
// implementation is platform-specific.
static uint64_t getThreadID();
private:
static constexpr size_t kInvalidSlotID = SIZE_MAX;
@ -146,10 +150,6 @@ private:
void markReadWrite(void *Ptr, size_t Size) const;
void markInaccessible(void *Ptr, size_t Size) const;
// Get the current thread ID, or kInvalidThreadID if failure. Note: This
// implementation is platform-specific.
static uint64_t getThreadID();
// Get the page size from the platform-specific implementation. Only needs to
// be called once, and the result should be cached in PageSize in this class.
static size_t getPlatformPageSize();

View File

@ -7,12 +7,14 @@
//===----------------------------------------------------------------------===//
#include "gwp_asan/random.h"
#include "gwp_asan/guarded_pool_allocator.h"
#include <time.h>
namespace gwp_asan {
uint32_t getRandomUnsigned32() {
thread_local uint32_t RandomState = static_cast<uint64_t>(time(nullptr));
thread_local uint32_t RandomState =
time(nullptr) + GuardedPoolAllocator::getThreadID();
RandomState ^= RandomState << 13;
RandomState ^= RandomState >> 17;
RandomState ^= RandomState << 5;