[PATCH] D24131: Add NewAddressDescription, which can describe any type of address.

Filipe Cabecinhas via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 5 09:20:19 PDT 2016


filcab updated this revision to Diff 70338.
filcab marked an inline comment as done.
filcab added a comment.

Update after code review


https://reviews.llvm.org/D24131

Files:
  lib/asan/asan_descriptions.h

Index: lib/asan/asan_descriptions.h
===================================================================
--- lib/asan/asan_descriptions.h
+++ lib/asan/asan_descriptions.h
@@ -165,6 +165,81 @@
 void PrintAddressDescription(uptr addr, uptr access_size = 1,
                              const char *bug_type = "");
 
+enum AddressKind {
+  kAddressKindWild,
+  kAddressKindShadow,
+  kAddressKindHeap,
+  kAddressKindStack,
+  kAddressKindGlobal,
+};
+
+struct NewAddressDescriptionBase {
+  AddressKind kind;
+  union {
+    ShadowAddressDescription shadow;
+    HeapAddressDescription heap;
+    StackAddressDescription stack;
+    GlobalAddressDescription global;
+    uptr addr;
+  };
+  uptr Address() {
+    switch (kind) {
+      case kAddressKindWild:
+        return addr;
+      case kAddressKindShadow:
+        return shadow.addr;
+      case kAddressKindHeap:
+        return heap.addr;
+      case kAddressKindStack:
+        return stack.addr;
+      case kAddressKindGlobal:
+        return global.addr;
+    }
+  }
+  void Print() {
+    switch (kind) {
+      case kAddressKindWild:
+        Printf("Address %p is a wild pointer.\n", addr);
+        return;
+      case kAddressKindShadow:
+        return shadow.Print();
+      case kAddressKindHeap:
+        return heap.Print();
+      case kAddressKindStack:
+        return stack.Print();
+      case kAddressKindGlobal:
+        return global.Print();
+    }
+  }
+};
+
+struct NewAddressDescription : NewAddressDescriptionBase {
+  NewAddressDescription() { *this = {}; }
+  explicit NewAddressDescription(uptr addr) {
+    if (GetShadowAddressInformation(addr, &shadow)) {
+      kind = kAddressKindShadow;
+      return;
+    }
+    if (GetHeapAddressInformation(addr, 1, &heap)) {
+      kind = kAddressKindHeap;
+      return;
+    }
+    asanThreadRegistry().Lock();
+    if (GetStackAddressInformation(addr, &stack)) {
+      kind = kAddressKindStack;
+      asanThreadRegistry().Unlock();
+      return;
+    }
+    asanThreadRegistry().Unlock();
+    if (GetGlobalAddressInformation(addr, &global)) {
+      kind = kAddressKindGlobal;
+      return;
+    }
+    kind = kAddressKindWild;
+    addr = 0;
+  }
+};
+
 }  // namespace __asan
 
 #endif  // ASAN_DESCRIPTIONS_H


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D24131.70338.patch
Type: text/x-patch
Size: 2251 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160905/16efba31/attachment.bin>


More information about the llvm-commits mailing list