[compiler-rt] ab08c38 - Revert "Revert "[compiler-rt][asan] Make wild-pointer crash error more useful""

Vy Nguyen via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 12 08:36:33 PST 2021


Author: Vy Nguyen
Date: 2021-03-12T11:35:50-05:00
New Revision: ab08c3865b37541ed1804f69196d61ecd5e1c3e6

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

LOG: Revert "Revert "[compiler-rt][asan] Make wild-pointer crash error more useful""

This reverts commit c578508b5bb20ccce5e2a43dd2afc41a49afec74.

Reland now that unrelated crash has been resolved.

Added: 
    compiler-rt/test/asan/TestCases/wild_pointer.cpp

Modified: 
    compiler-rt/lib/asan/asan_descriptions.cpp
    compiler-rt/lib/asan/asan_descriptions.h

Removed: 
    


################################################################################
diff  --git a/compiler-rt/lib/asan/asan_descriptions.cpp b/compiler-rt/lib/asan/asan_descriptions.cpp
index 153c874a4e77..347eaa4a824f 100644
--- a/compiler-rt/lib/asan/asan_descriptions.cpp
+++ b/compiler-rt/lib/asan/asan_descriptions.cpp
@@ -77,7 +77,6 @@ static bool GetShadowKind(uptr addr, ShadowKind *shadow_kind) {
   } else if (AddrIsInLowShadow(addr)) {
     *shadow_kind = kShadowKindLow;
   } else {
-    CHECK(0 && "Address is not in memory and not in shadow?");
     return false;
   }
   return true;
@@ -464,7 +463,13 @@ AddressDescription::AddressDescription(uptr addr, uptr access_size,
     return;
   }
   data.kind = kAddressKindWild;
-  addr = 0;
+  data.wild.addr = addr;
+  data.wild.access_size = access_size;
+}
+
+void WildAddressDescription::Print() const {
+  Printf("Address %p is a wild pointer inside of access range of size %p.\n",
+         addr, access_size);
 }
 
 void PrintAddressDescription(uptr addr, uptr access_size,

diff  --git a/compiler-rt/lib/asan/asan_descriptions.h b/compiler-rt/lib/asan/asan_descriptions.h
index ee0e2061559e..650e2eb9173a 100644
--- a/compiler-rt/lib/asan/asan_descriptions.h
+++ b/compiler-rt/lib/asan/asan_descriptions.h
@@ -146,6 +146,13 @@ struct StackAddressDescription {
 bool GetStackAddressInformation(uptr addr, uptr access_size,
                                 StackAddressDescription *descr);
 
+struct WildAddressDescription {
+  uptr addr;
+  uptr access_size;
+
+  void Print() const;
+};
+
 struct GlobalAddressDescription {
   uptr addr;
   // Assume address is close to at most four globals.
@@ -193,7 +200,7 @@ class AddressDescription {
       HeapAddressDescription heap;
       StackAddressDescription stack;
       GlobalAddressDescription global;
-      uptr addr;
+      WildAddressDescription wild;
     };
   };
 
@@ -211,7 +218,7 @@ class AddressDescription {
   uptr Address() const {
     switch (data.kind) {
       case kAddressKindWild:
-        return data.addr;
+        return data.wild.addr;
       case kAddressKindShadow:
         return data.shadow.addr;
       case kAddressKindHeap:
@@ -226,7 +233,7 @@ class AddressDescription {
   void Print(const char *bug_descr = nullptr) const {
     switch (data.kind) {
       case kAddressKindWild:
-        Printf("Address %p is a wild pointer.\n", data.addr);
+        data.wild.Print();
         return;
       case kAddressKindShadow:
         return data.shadow.Print();

diff  --git a/compiler-rt/test/asan/TestCases/wild_pointer.cpp b/compiler-rt/test/asan/TestCases/wild_pointer.cpp
new file mode 100644
index 000000000000..80c3e2b254e5
--- /dev/null
+++ b/compiler-rt/test/asan/TestCases/wild_pointer.cpp
@@ -0,0 +1,22 @@
+// RUN: %clangxx_asan %s -o %t
+// RUN: not %run %t 2>&1 | FileCheck %s
+// REQUIRES: asan-64-bits
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+int main() {
+  char *p = new char;
+  char *dest = new char;
+  const size_t offset = 0x4567890123456789;
+  // Flush it so the output came out before the asan report.
+  fprintf(stderr, "Expected bad addr: %p\n", p + offset);
+  fflush(stderr);
+  memmove(dest, p, offset);
+  return 0;
+}
+
+// CHECK: Expected bad addr: [[ADDR:0x[0-9,a-f]+]]
+// CHECK: AddressSanitizer: unknown-crash on address [[ADDR]]
+// CHECK: Address [[ADDR]] is a wild pointer inside of access range of size 0x4567890123456789


        


More information about the llvm-commits mailing list