[compiler-rt] 0d6fccb - [GWP-ASan] Allow late initialisation if single-threaded.

Mitch Phillips via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 3 12:35:02 PST 2020


Author: Mitch Phillips
Date: 2020-02-03T12:34:26-08:00
New Revision: 0d6fccb460e515a78c33dcd97cda459332ddd63a

URL: https://github.com/llvm/llvm-project/commit/0d6fccb460e515a78c33dcd97cda459332ddd63a
DIFF: https://github.com/llvm/llvm-project/commit/0d6fccb460e515a78c33dcd97cda459332ddd63a.diff

LOG: [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

Added: 
    compiler-rt/lib/gwp_asan/tests/late_init.cpp

Modified: 
    compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp
    compiler-rt/lib/gwp_asan/tests/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp b/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp
index 1883ec7f5e64..5e6008e6a2c0 100644
--- a/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp
+++ b/compiler-rt/lib/gwp_asan/guarded_pool_allocator.cpp
@@ -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;

diff  --git a/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt b/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt
index b21c62c0d715..6676b2e9132a 100644
--- a/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt
+++ b/compiler-rt/lib/gwp_asan/tests/CMakeLists.txt
@@ -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}

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
index 000000000000..c7d62c8f3c89
--- /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());
+}


        


More information about the llvm-commits mailing list