[compiler-rt] r363584 - [GWP-ASan] Integration with Scudo [5].

Mitch Phillips via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 17 10:45:34 PDT 2019


Author: hctim
Date: Mon Jun 17 10:45:34 2019
New Revision: 363584

URL: http://llvm.org/viewvc/llvm-project?rev=363584&view=rev
Log:
[GWP-ASan] Integration with Scudo [5].

Summary:
See D60593 for further information.

This patch adds GWP-ASan support to the Scudo hardened allocator. It also
implements end-to-end integration tests using Scudo as the backing allocator.
The tests include crash handling for buffer over/underflow as well as
use-after-free detection.

Reviewers: vlad.tsyrklevich, cryptoad

Reviewed By: vlad.tsyrklevich, cryptoad

Subscribers: kubamracek, mgorny, #sanitizers, llvm-commits, morehouse

Tags: #sanitizers, #llvm

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

Added:
    compiler-rt/trunk/test/gwp_asan/double_delete.cpp
    compiler-rt/trunk/test/gwp_asan/double_deletea.cpp
    compiler-rt/trunk/test/gwp_asan/double_free.cpp
    compiler-rt/trunk/test/gwp_asan/heap_buffer_overflow.cpp
    compiler-rt/trunk/test/gwp_asan/heap_buffer_underflow.cpp
    compiler-rt/trunk/test/gwp_asan/invalid_free_left.cpp
    compiler-rt/trunk/test/gwp_asan/invalid_free_right.cpp
    compiler-rt/trunk/test/gwp_asan/page_size.h
    compiler-rt/trunk/test/gwp_asan/realloc.cpp
    compiler-rt/trunk/test/gwp_asan/repeated_alloc.cpp
    compiler-rt/trunk/test/gwp_asan/use_after_delete.cpp
    compiler-rt/trunk/test/gwp_asan/use_after_deletea.cpp
    compiler-rt/trunk/test/gwp_asan/use_after_free.cpp
Removed:
    compiler-rt/trunk/test/gwp_asan/dummy_test.cc
Modified:
    compiler-rt/trunk/lib/scudo/CMakeLists.txt
    compiler-rt/trunk/lib/scudo/scudo_allocator.cpp
    compiler-rt/trunk/test/gwp_asan/CMakeLists.txt
    compiler-rt/trunk/test/gwp_asan/lit.cfg
    compiler-rt/trunk/test/lit.common.cfg
    compiler-rt/trunk/test/lit.common.configured.in
    compiler-rt/trunk/test/scudo/lit.cfg

Modified: compiler-rt/trunk/lib/scudo/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/scudo/CMakeLists.txt?rev=363584&r1=363583&r2=363584&view=diff
==============================================================================
--- compiler-rt/trunk/lib/scudo/CMakeLists.txt (original)
+++ compiler-rt/trunk/lib/scudo/CMakeLists.txt Mon Jun 17 10:45:34 2019
@@ -30,6 +30,15 @@ set(SCUDO_MINIMAL_OBJECT_LIBS
   RTSanitizerCommonNoTermination
   RTSanitizerCommonLibc
   RTInterception)
+
+if (COMPILER_RT_HAS_GWP_ASAN)
+  # Currently, Scudo uses the GwpAsan flag parser. This backs onto the flag
+  # parsing mechanism of sanitizer_common. Once Scudo has its own flag parsing,
+  # and parses GwpAsan options, you can remove this dependency.
+  list(APPEND SCUDO_MINIMAL_OBJECT_LIBS RTGwpAsan RTGwpAsanOptionsParser)
+  list(APPEND SCUDO_CFLAGS -DGWP_ASAN_HOOKS)
+endif()
+
 set(SCUDO_OBJECT_LIBS ${SCUDO_MINIMAL_OBJECT_LIBS})
 set(SCUDO_DYNAMIC_LIBS ${SCUDO_MINIMAL_DYNAMIC_LIBS})
 

Modified: compiler-rt/trunk/lib/scudo/scudo_allocator.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/scudo/scudo_allocator.cpp?rev=363584&r1=363583&r2=363584&view=diff
==============================================================================
--- compiler-rt/trunk/lib/scudo/scudo_allocator.cpp (original)
+++ compiler-rt/trunk/lib/scudo/scudo_allocator.cpp Mon Jun 17 10:45:34 2019
@@ -25,6 +25,11 @@
 #include "sanitizer_common/sanitizer_allocator_interface.h"
 #include "sanitizer_common/sanitizer_quarantine.h"
 
+#ifdef GWP_ASAN_HOOKS
+# include "gwp_asan/guarded_pool_allocator.h"
+# include "gwp_asan/optional/options_parser.h"
+#endif // GWP_ASAN_HOOKS
+
 #include <errno.h>
 #include <string.h>
 
@@ -213,6 +218,10 @@ QuarantineCacheT *getQuarantineCache(Scu
   return reinterpret_cast<QuarantineCacheT *>(TSD->QuarantineCachePlaceHolder);
 }
 
+#ifdef GWP_ASAN_HOOKS
+static gwp_asan::GuardedPoolAllocator GuardedAlloc;
+#endif // GWP_ASAN_HOOKS
+
 struct Allocator {
   static const uptr MaxAllowedMallocSize =
       FIRST_32_SECOND_64(2UL << 30, 1ULL << 40);
@@ -291,6 +300,14 @@ struct Allocator {
   void *allocate(uptr Size, uptr Alignment, AllocType Type,
                  bool ForceZeroContents = false) {
     initThreadMaybe();
+
+#ifdef GWP_ASAN_HOOKS
+    if (UNLIKELY(GuardedAlloc.shouldSample())) {
+      if (void *Ptr = GuardedAlloc.allocate(Size))
+        return Ptr;
+    }
+#endif // GWP_ASAN_HOOKS
+
     if (UNLIKELY(Alignment > MaxAlignment)) {
       if (AllocatorMayReturnNull())
         return nullptr;
@@ -434,6 +451,14 @@ struct Allocator {
       __sanitizer_free_hook(Ptr);
     if (UNLIKELY(!Ptr))
       return;
+
+#ifdef GWP_ASAN_HOOKS
+    if (UNLIKELY(GuardedAlloc.pointerIsMine(Ptr))) {
+      GuardedAlloc.deallocate(Ptr);
+      return;
+    }
+#endif // GWP_ASAN_HOOKS
+
     if (UNLIKELY(!Chunk::isAligned(Ptr)))
       dieWithMessage("misaligned pointer when deallocating address %p\n", Ptr);
     UnpackedHeader Header;
@@ -463,6 +488,18 @@ struct Allocator {
   // size still fits in the chunk.
   void *reallocate(void *OldPtr, uptr NewSize) {
     initThreadMaybe();
+
+#ifdef GWP_ASAN_HOOKS
+    if (UNLIKELY(GuardedAlloc.pointerIsMine(OldPtr))) {
+      size_t OldSize = GuardedAlloc.getSize(OldPtr);
+      void *NewPtr = allocate(NewSize, MinAlignment, FromMalloc);
+      if (NewPtr)
+        memcpy(NewPtr, OldPtr, (NewSize < OldSize) ? NewSize : OldSize);
+      GuardedAlloc.deallocate(OldPtr);
+      return NewPtr;
+    }
+#endif // GWP_ASAN_HOOKS
+
     if (UNLIKELY(!Chunk::isAligned(OldPtr)))
       dieWithMessage("misaligned address when reallocating address %p\n",
                      OldPtr);
@@ -504,6 +541,12 @@ struct Allocator {
     initThreadMaybe();
     if (UNLIKELY(!Ptr))
       return 0;
+
+#ifdef GWP_ASAN_HOOKS
+    if (UNLIKELY(GuardedAlloc.pointerIsMine(Ptr)))
+      return GuardedAlloc.getSize(Ptr);
+#endif // GWP_ASAN_HOOKS
+
     UnpackedHeader Header;
     Chunk::loadHeader(Ptr, &Header);
     // Getting the usable size of a chunk only makes sense if it's allocated.
@@ -626,6 +669,10 @@ static BackendT &getBackend() {
 
 void initScudo() {
   Instance.init();
+#ifdef GWP_ASAN_HOOKS
+  gwp_asan::options::initOptions();
+  GuardedAlloc.init(gwp_asan::options::getOptions());
+#endif // GWP_ASAN_HOOKS
 }
 
 void ScudoTSD::init() {

Modified: compiler-rt/trunk/test/gwp_asan/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/CMakeLists.txt?rev=363584&r1=363583&r2=363584&view=diff
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/CMakeLists.txt (original)
+++ compiler-rt/trunk/test/gwp_asan/CMakeLists.txt Mon Jun 17 10:45:34 2019
@@ -6,7 +6,8 @@ set(GWP_ASAN_TESTSUITES)
 set(GWP_ASAN_UNITTEST_DEPS)
 set(GWP_ASAN_TEST_DEPS
   ${SANITIZER_COMMON_LIT_TEST_DEPS}
-  gwp_asan)
+  gwp_asan
+  scudo)
 
 # Longstanding issues in the Android test runner means that compiler-rt unit
 # tests don't work on Android due to libc++ link-time issues. Looks like the

Added: compiler-rt/trunk/test/gwp_asan/double_delete.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/double_delete.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/double_delete.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/double_delete.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,15 @@
+// REQUIRES: gwp_asan
+// RUN: %clangxx_gwp_asan %s -o %t
+// RUN: not %run %t 2>&1 | FileCheck %s
+
+// CHECK: GWP-ASan detected a memory error
+// CHECK: Double free occurred when trying to free memory at:
+
+#include <cstdlib>
+
+int main() {
+  char *Ptr = new char;
+  delete Ptr;
+  delete Ptr;
+  return 0;
+}

Added: compiler-rt/trunk/test/gwp_asan/double_deletea.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/double_deletea.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/double_deletea.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/double_deletea.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,15 @@
+// REQUIRES: gwp_asan
+// RUN: %clangxx_gwp_asan %s -o %t
+// RUN: not %run %t 2>&1 | FileCheck %s
+
+// CHECK: GWP-ASan detected a memory error
+// CHECK: Double free occurred when trying to free memory at:
+
+#include <cstdlib>
+
+int main() {
+  char *Ptr = new char[50];
+  delete[] Ptr;
+  delete[] Ptr;
+  return 0;
+}

Added: compiler-rt/trunk/test/gwp_asan/double_free.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/double_free.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/double_free.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/double_free.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,15 @@
+// REQUIRES: gwp_asan
+// RUN: %clangxx_gwp_asan %s -o %t
+// RUN: not %run %t 2>&1 | FileCheck %s
+
+// CHECK: GWP-ASan detected a memory error
+// CHECK: Double free occurred when trying to free memory at:
+
+#include <cstdlib>
+
+int main() {
+  void *Ptr = malloc(10);
+  free(Ptr);
+  free(Ptr);
+  return 0;
+}

Removed: compiler-rt/trunk/test/gwp_asan/dummy_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/dummy_test.cc?rev=363583&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/dummy_test.cc (original)
+++ compiler-rt/trunk/test/gwp_asan/dummy_test.cc (removed)
@@ -1,4 +0,0 @@
-// Exists to simply stop warnings about lit not discovering any tests here.
-// RUN: %clang %s -o %s.o
-
-int main() { return 0; }

Added: compiler-rt/trunk/test/gwp_asan/heap_buffer_overflow.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/heap_buffer_overflow.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/heap_buffer_overflow.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/heap_buffer_overflow.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,18 @@
+// REQUIRES: gwp_asan
+// RUN: %clangxx_gwp_asan %s -o %t
+// RUN: %expect_crash %run %t 2>&1 | FileCheck %s
+
+// CHECK: GWP-ASan detected a memory error
+// CHECK: Buffer overflow occurred when accessing memory at:
+// CHECK: is located {{[0-9]+}} bytes to the right
+
+#include <cstdlib>
+
+#include "page_size.h"
+
+int main() {
+  char *Ptr =
+      reinterpret_cast<char *>(malloc(pageSize()));
+  volatile char x = *(Ptr + pageSize());
+  return 0;
+}

Added: compiler-rt/trunk/test/gwp_asan/heap_buffer_underflow.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/heap_buffer_underflow.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/heap_buffer_underflow.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/heap_buffer_underflow.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,18 @@
+// REQUIRES: gwp_asan
+// RUN: %clangxx_gwp_asan %s -o %t
+// RUN: %expect_crash %run %t 2>&1 | FileCheck %s
+
+// CHECK: GWP-ASan detected a memory error
+// CHECK: Buffer underflow occurred when accessing memory at:
+// CHECK: is located 1 bytes to the left
+
+#include <cstdlib>
+
+#include "page_size.h"
+
+int main() {
+  char *Ptr =
+      reinterpret_cast<char *>(malloc(pageSize()));
+  volatile char x = *(Ptr - 1);
+  return 0;
+}

Added: compiler-rt/trunk/test/gwp_asan/invalid_free_left.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/invalid_free_left.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/invalid_free_left.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/invalid_free_left.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,16 @@
+// REQUIRES: gwp_asan
+// RUN: %clangxx_gwp_asan %s -o %t
+// RUN: not %run %t 2>&1 | FileCheck %s
+
+// CHECK: GWP-ASan detected a memory error
+// CHECK: Invalid (wild) free occurred when trying to free memory at:
+// CHECK: is located 1 bytes to the left of
+
+#include <cstdlib>
+
+int main() {
+  char *Ptr =
+      reinterpret_cast<char *>(malloc(1));
+  free(Ptr - 1);
+  return 0;
+}

Added: compiler-rt/trunk/test/gwp_asan/invalid_free_right.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/invalid_free_right.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/invalid_free_right.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/invalid_free_right.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,16 @@
+// REQUIRES: gwp_asan
+// RUN: %clangxx_gwp_asan %s -o %t
+// RUN: not %run %t 2>&1 | FileCheck %s
+
+// CHECK: GWP-ASan detected a memory error
+// CHECK: Invalid (wild) free occurred when trying to free memory at:
+// CHECK: is located 1 bytes to the right
+
+#include <cstdlib>
+
+int main() {
+  char *Ptr =
+      reinterpret_cast<char *>(malloc(1));
+  free(Ptr + 1);
+  return 0;
+}

Modified: compiler-rt/trunk/test/gwp_asan/lit.cfg
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/lit.cfg?rev=363584&r1=363583&r2=363584&view=diff
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/lit.cfg (original)
+++ compiler-rt/trunk/test/gwp_asan/lit.cfg Mon Jun 17 10:45:34 2019
@@ -20,11 +20,24 @@ if not config.android:
 
 cxx_flags = (c_flags + config.cxx_mode_flags + ["-std=c++11"])
 
+gwp_asan_flags = ["-fsanitize=scudo"]
+
 def build_invocation(compile_flags):
   return " " + " ".join([config.clang] + compile_flags) + " "
 
 # Add substitutions.
 config.substitutions.append(("%clang ", build_invocation(c_flags)))
+config.substitutions.append(("%clang_gwp_asan ", build_invocation(c_flags + gwp_asan_flags)))
+config.substitutions.append(("%clangxx_gwp_asan ", build_invocation(cxx_flags + gwp_asan_flags)))
+
+# Platform-specific default GWP_ASAN for lit tests. Ensure that GWP-ASan is
+# enabled and that it samples every allocation.
+default_gwp_asan_options = 'Enabled=1:SampleRate=1'
+
+config.environment['GWP_ASAN_OPTIONS'] = default_gwp_asan_options
+default_gwp_asan_options += ':'
+config.substitutions.append(('%env_gwp_asan_options=',
+                             'env GWP_ASAN_OPTIONS=' + default_gwp_asan_options))
 
 # GWP-ASan tests are currently supported on Linux only.
 if config.host_os not in ['Linux']:

Added: compiler-rt/trunk/test/gwp_asan/page_size.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/page_size.h?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/page_size.h (added)
+++ compiler-rt/trunk/test/gwp_asan/page_size.h Mon Jun 17 10:45:34 2019
@@ -0,0 +1,13 @@
+#ifndef PAGE_SIZE_
+#define PAGE_SIZE_
+
+#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__))
+# include <unistd.h>
+unsigned pageSize() {
+  return sysconf(_SC_PAGESIZE);
+}
+#else
+# error "GWP-ASan is not supported on this platform."
+#endif
+
+#endif // PAGE_SIZE_

Added: compiler-rt/trunk/test/gwp_asan/realloc.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/realloc.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/realloc.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/realloc.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,44 @@
+// REQUIRES: gwp_asan
+// RUN: %clangxx_gwp_asan %s -o %t -DTEST_MALLOC
+// RUN: not %run %t 2>&1 | FileCheck %s --check-prefix CHECK-MALLOC
+
+// Check both C++98 and C.
+// RUN: %clangxx_gwp_asan -std=c++98 %s -o %t -DTEST_FREE
+// RUN: %expect_crash %run %t 2>&1 | FileCheck %s --check-prefix CHECK-FREE
+// RUN: cp %s %t.c && %clang_gwp_asan %t.c -o %t -DTEST_FREE
+// RUN: %expect_crash %run %t 2>&1 | FileCheck %s --check-prefix CHECK-FREE
+
+// Ensure GWP-ASan stub implementation of realloc() in Scudo works to-spec. In
+// particular, the behaviour regarding realloc of size zero is interesting, as
+// it's defined as free().
+
+#include <stdlib.h>
+
+int main() {
+#if defined(TEST_MALLOC)
+  // realloc(nullptr, size) is equivalent to malloc(size).
+  char *Ptr = reinterpret_cast<char *>(realloc(nullptr, 1));
+  *Ptr = 0;
+  // Trigger an INVALID_FREE to the right.
+  free(Ptr + 1);
+
+  // CHECK-MALLOC: GWP-ASan detected a memory error
+  // CHECK-MALLOC: Invalid (wild) free occurred when trying to free memory at:
+  // CHECK-MALLOC: is located 1 bytes to the right of a 1-byte allocation
+#elif defined(TEST_FREE)
+  char *Ptr = (char *) malloc(1);
+  // realloc(ptr, 0) is equivalent to free(ptr) and must return nullptr. Note
+  // that this is only the specification in C++98 and C.
+  if (realloc(Ptr, 0) != NULL) {
+
+  }
+  // Trigger a USE_AFTER_FREE.
+  *Ptr = 0;
+
+  // CHECK-FREE: GWP-ASan detected a memory error
+  // CHECK-FREE: Use after free occurred when accessing memory at:
+  // CHECK-FREE: is a 1-byte allocation
+#endif
+
+  return 0;
+}

Added: compiler-rt/trunk/test/gwp_asan/repeated_alloc.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/repeated_alloc.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/repeated_alloc.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/repeated_alloc.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,28 @@
+// REQUIRES: gwp_asan
+// This test ensures that normal allocation/memory access/deallocation works
+// as expected and we didn't accidentally break the supporting allocator.
+
+// RUN: %clangxx_gwp_asan %s -o %t
+// RUN: %env_gwp_asan_options=MaxSimultaneousAllocations=1 %run %t
+// RUN: %env_gwp_asan_options=MaxSimultaneousAllocations=2 %run %t
+// RUN: %env_gwp_asan_options=MaxSimultaneousAllocations=11 %run %t
+// RUN: %env_gwp_asan_options=MaxSimultaneousAllocations=12 %run %t
+// RUN: %env_gwp_asan_options=MaxSimultaneousAllocations=13 %run %t
+
+#include <cstdlib>
+
+int main() {
+  void* Pointers[16];
+  for (unsigned i = 0; i < 16; ++i) {
+    char *Ptr = reinterpret_cast<char*>(malloc(1 << i));
+    Pointers[i] = Ptr;
+    *Ptr = 0;
+    Ptr[(1 << i) - 1] = 0;
+  }
+
+  for (unsigned i = 0; i < 16; ++i) {
+    free(Pointers[i]);
+  }
+
+  return 0;
+}

Added: compiler-rt/trunk/test/gwp_asan/use_after_delete.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/use_after_delete.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/use_after_delete.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/use_after_delete.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,18 @@
+// REQUIRES: gwp_asan
+// RUN: %clangxx_gwp_asan %s -o %t
+// RUN: %expect_crash %run %t 2>&1 | FileCheck %s
+
+// CHECK: GWP-ASan detected a memory error
+// CHECK: Use after free occurred when accessing memory at:
+
+#include <cstdlib>
+
+int main() {
+  char *Ptr = new char;
+
+  *Ptr = 0x0;
+
+  delete Ptr;
+  volatile char x = *Ptr;
+  return 0;
+}

Added: compiler-rt/trunk/test/gwp_asan/use_after_deletea.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/use_after_deletea.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/use_after_deletea.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/use_after_deletea.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,20 @@
+// REQUIRES: gwp_asan
+// RUN: %clangxx_gwp_asan %s -o %t
+// RUN: %expect_crash %run %t 2>&1 | FileCheck %s
+
+// CHECK: GWP-ASan detected a memory error
+// CHECK: Use after free occurred when accessing memory at:
+
+#include <cstdlib>
+
+int main() {
+  char *Ptr = new char[10];
+
+  for (unsigned i = 0; i < 10; ++i) {
+    *(Ptr + i) = 0x0;
+  }
+
+  delete[] Ptr;
+  volatile char x = *Ptr;
+  return 0;
+}

Added: compiler-rt/trunk/test/gwp_asan/use_after_free.cpp
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/gwp_asan/use_after_free.cpp?rev=363584&view=auto
==============================================================================
--- compiler-rt/trunk/test/gwp_asan/use_after_free.cpp (added)
+++ compiler-rt/trunk/test/gwp_asan/use_after_free.cpp Mon Jun 17 10:45:34 2019
@@ -0,0 +1,20 @@
+// REQUIRES: gwp_asan
+// RUN: %clangxx_gwp_asan %s -o %t
+// RUN: %expect_crash %run %t 2>&1 | FileCheck %s
+
+// CHECK: GWP-ASan detected a memory error
+// CHECK: Use after free occurred when accessing memory at:
+
+#include <cstdlib>
+
+int main() {
+  char *Ptr = reinterpret_cast<char *>(malloc(10));
+
+  for (unsigned i = 0; i < 10; ++i) {
+    *(Ptr + i) = 0x0;
+  }
+
+  free(Ptr);
+  volatile char x = *Ptr;
+  return 0;
+}

Modified: compiler-rt/trunk/test/lit.common.cfg
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lit.common.cfg?rev=363584&r1=363583&r2=363584&view=diff
==============================================================================
--- compiler-rt/trunk/test/lit.common.cfg (original)
+++ compiler-rt/trunk/test/lit.common.cfg Mon Jun 17 10:45:34 2019
@@ -239,6 +239,9 @@ if config.use_lld:
 if config.can_symbolize:
   config.available_features.add('can-symbolize')
 
+if config.gwp_asan:
+  config.available_features.add('gwp_asan')
+
 lit.util.usePlatformSdkOnDarwin(config, lit_config)
 
 if config.host_os == 'Darwin':

Modified: compiler-rt/trunk/test/lit.common.configured.in
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/lit.common.configured.in?rev=363584&r1=363583&r2=363584&view=diff
==============================================================================
--- compiler-rt/trunk/test/lit.common.configured.in (original)
+++ compiler-rt/trunk/test/lit.common.configured.in Mon Jun 17 10:45:34 2019
@@ -41,6 +41,7 @@ set_default("android_ndk_version", @ANDR
 set_default("android_serial", "@ANDROID_SERIAL_FOR_TESTING@")
 set_default("android_files_to_push", [])
 set_default("have_rpc_xdr_h", @HAVE_RPC_XDR_H@)
+set_default("gwp_asan", @COMPILER_RT_HAS_GWP_ASAN_PYBOOL@)
 config.available_features.add('target-is-%s' % config.target_arch)
 
 if config.enable_per_target_runtime_dir:

Modified: compiler-rt/trunk/test/scudo/lit.cfg
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/scudo/lit.cfg?rev=363584&r1=363583&r2=363584&view=diff
==============================================================================
--- compiler-rt/trunk/test/scudo/lit.cfg (original)
+++ compiler-rt/trunk/test/scudo/lit.cfg Mon Jun 17 10:45:34 2019
@@ -49,6 +49,10 @@ if config.android:
   # Android defaults to abort_on_error=1, which doesn't work for us.
   default_scudo_opts = 'abort_on_error=0'
 
+# Disable GWP-ASan for scudo internal tests.
+if config.gwp_asan:
+  config.environment['GWP_ASAN_OPTIONS'] = 'Enabled=0'
+
 if default_scudo_opts:
   config.environment['SCUDO_OPTIONS'] = default_scudo_opts
   default_scudo_opts += ':'




More information about the llvm-commits mailing list