forked from OSchip/llvm-project
[GWP-ASan] Allow late initialisation if single-threaded.
Summary: This patch allows for late initialisation of the GWP-ASan allocator. Previously, if late initialisation occurred, the sample counter was never updated, meaning we would end up having to wait for 2^32 allocations before getting a sampled allocation. Now, we initialise the sampling mechanism in init() as well. We require init() to be called single-threaded, so this isn't a problem. Reviewers: eugenis Reviewed By: eugenis Subscribers: merge_guards_bot, mgorny, #sanitizers, llvm-commits, cferris Tags: #sanitizers, #llvm Differential Revision: https://reviews.llvm.org/D73896
This commit is contained in:
parent
2758ae41ae
commit
0d6fccb460
|
@ -164,6 +164,9 @@ void GuardedPoolAllocator::init(const options::Options &Opts) {
|
|||
else
|
||||
AdjustedSampleRatePlusOne = 2;
|
||||
|
||||
ThreadLocals.NextSampleCounter =
|
||||
(getRandomUnsigned32() % (AdjustedSampleRatePlusOne - 1)) + 1;
|
||||
|
||||
GuardedPagePool = reinterpret_cast<uintptr_t>(GuardedPoolMemory);
|
||||
GuardedPagePoolEnd =
|
||||
reinterpret_cast<uintptr_t>(GuardedPoolMemory) + PoolBytesRequired;
|
||||
|
|
|
@ -20,7 +20,8 @@ set(GWP_ASAN_UNITTESTS
|
|||
slot_reuse.cpp
|
||||
thread_contention.cpp
|
||||
harness.cpp
|
||||
enable_disable.cpp)
|
||||
enable_disable.cpp
|
||||
late_init.cpp)
|
||||
|
||||
set(GWP_ASAN_UNIT_TEST_HEADERS
|
||||
${GWP_ASAN_HEADERS}
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
//===-- late_init.cpp -------------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "gwp_asan/guarded_pool_allocator.h"
|
||||
#include "gwp_asan/options.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
TEST(LateInit, CheckLateInitIsOK) {
|
||||
gwp_asan::GuardedPoolAllocator GPA;
|
||||
|
||||
for (size_t i = 0; i < 0x100; ++i)
|
||||
EXPECT_FALSE(GPA.shouldSample());
|
||||
|
||||
gwp_asan::options::Options Opts;
|
||||
Opts.Enabled = true;
|
||||
Opts.SampleRate = 1;
|
||||
|
||||
GPA.init(Opts);
|
||||
EXPECT_TRUE(GPA.shouldSample());
|
||||
}
|
Loading…
Reference in New Issue