diff --git a/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp b/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp --- a/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp +++ b/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp @@ -164,6 +164,9 @@ else AdjustedSampleRatePlusOne = 2; + ThreadLocals.NextSampleCounter = + (getRandomUnsigned32() % (AdjustedSampleRatePlusOne - 1)) + 1; + GuardedPagePool = reinterpret_cast(GuardedPoolMemory); GuardedPagePoolEnd = reinterpret_cast(GuardedPoolMemory) + PoolBytesRequired; diff --git a/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt b/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt --- a/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt +++ b/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt @@ -20,7 +20,8 @@ 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} diff --git a/compiler-rt/lib/gwp_asan/tests/late_init.cpp b/compiler-rt/lib/gwp_asan/tests/late_init.cpp new file mode 100644 --- /dev/null +++ b/compiler-rt/lib/gwp_asan/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()); +}