[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
GitOrigin-RevId: 0d6fccb460e515a78c33dcd97cda459332ddd63a
diff --git a/guarded_pool_allocator.cpp b/guarded_pool_allocator.cpp
index 1883ec7..5e6008e 100644
--- a/guarded_pool_allocator.cpp
+++ b/guarded_pool_allocator.cpp
@@ -164,6 +164,9 @@
else
AdjustedSampleRatePlusOne = 2;
+ ThreadLocals.NextSampleCounter =
+ (getRandomUnsigned32() % (AdjustedSampleRatePlusOne - 1)) + 1;
+
GuardedPagePool = reinterpret_cast<uintptr_t>(GuardedPoolMemory);
GuardedPagePoolEnd =
reinterpret_cast<uintptr_t>(GuardedPoolMemory) + PoolBytesRequired;
diff --git a/tests/late_init.cpp b/tests/late_init.cpp
new file mode 100644
index 0000000..c7d62c8
--- /dev/null
+++ b/tests/late_init.cpp
@@ -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());
+}