[compiler-rt] bfb5a4f - Revert "[HWASAN] Support short granules in __hwasan_test_shadow"

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 28 17:41:22 PDT 2023


Author: Vitaly Buka
Date: 2023-04-28T17:41:09-07:00
New Revision: bfb5a4fd53fa00d450a0434f20e2193fff196ae6

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

LOG: Revert "[HWASAN] Support short granules in __hwasan_test_shadow"

Break internal tests, but it supposed to be almost NFC.

This reverts commit bf12b746372a25c5a15fa9bd452bd469cc047b47.

Added: 
    

Modified: 
    compiler-rt/lib/hwasan/hwasan.cpp
    compiler-rt/lib/hwasan/hwasan_checks.h

Removed: 
    compiler-rt/test/hwasan/TestCases/test_shadow.c


################################################################################
diff  --git a/compiler-rt/lib/hwasan/hwasan.cpp b/compiler-rt/lib/hwasan/hwasan.cpp
index 26aae9b4869b9..097136fe5480c 100644
--- a/compiler-rt/lib/hwasan/hwasan.cpp
+++ b/compiler-rt/lib/hwasan/hwasan.cpp
@@ -445,32 +445,16 @@ void __hwasan_print_shadow(const void *p, uptr sz) {
 sptr __hwasan_test_shadow(const void *p, uptr sz) {
   if (sz == 0)
     return -1;
-  uptr ptr = reinterpret_cast<uptr>(p);
-  tag_t ptr_tag = GetTagFromPointer(ptr);
-  uptr ptr_raw = UntagAddr(ptr);
+  tag_t ptr_tag = GetTagFromPointer((uptr)p);
+  uptr ptr_raw = UntagAddr(reinterpret_cast<uptr>(p));
   uptr shadow_first = MemToShadow(ptr_raw);
-  uptr shadow_last = MemToShadow(ptr_raw + sz);
-  for (uptr s = shadow_first; s < shadow_last; ++s) {
-    if (UNLIKELY(*(tag_t *)s != ptr_tag)) {
-      uptr short_size =
-          ShortTagSize(*(tag_t *)s, AddTagToPointer(ShadowToMem(s), ptr_tag));
-      sptr offset = ShadowToMem(s) - ptr_raw + short_size;
+  uptr shadow_last = MemToShadow(ptr_raw + sz - 1);
+  for (uptr s = shadow_first; s <= shadow_last; ++s)
+    if (*(tag_t *)s != ptr_tag) {
+      sptr offset = ShadowToMem(s) - ptr_raw;
       return offset < 0 ? 0 : offset;
     }
-  }
-
-  uptr end = ptr + sz;
-  uptr tail_sz = end & (kShadowAlignment - 1);
-  if (!tail_sz)
-    return -1;
-
-  uptr short_size =
-      ShortTagSize(*(tag_t *)shadow_last, end & ~(kShadowAlignment - 1));
-  if (LIKELY(tail_sz <= short_size))
-    return -1;
-
-  sptr offset = sz - tail_sz + short_size;
-  return offset < 0 ? 0 : offset;
+  return -1;
 }
 
 u16 __sanitizer_unaligned_load16(const uu16 *p) {

diff  --git a/compiler-rt/lib/hwasan/hwasan_checks.h b/compiler-rt/lib/hwasan/hwasan_checks.h
index 670aa61067ce0..4ffd5246cbd21 100644
--- a/compiler-rt/lib/hwasan/hwasan_checks.h
+++ b/compiler-rt/lib/hwasan/hwasan_checks.h
@@ -125,22 +125,8 @@ __attribute__((always_inline)) static void SigTrap(uptr p, uptr size) {
   // __builtin_unreachable();
 }
 
-__attribute__((always_inline, nodebug)) static inline uptr ShortTagSize(
-    tag_t mem_tag, uptr ptr) {
-  DCHECK(IsAligned(ptr, kShadowAlignment));
-  tag_t ptr_tag = GetTagFromPointer(ptr);
-  if (ptr_tag == mem_tag)
-    return kShadowAlignment;
-  if (mem_tag >= kShadowAlignment)
-    return 0;
-  if (*(u8 *)(ptr | (kShadowAlignment - 1)) != ptr_tag)
-    return 0;
-  return mem_tag;
-}
-
 __attribute__((always_inline, nodebug)) static inline bool
 PossiblyShortTagMatches(tag_t mem_tag, uptr ptr, uptr sz) {
-  DCHECK(IsAligned(ptr, kShadowAlignment));
   tag_t ptr_tag = GetTagFromPointer(ptr);
   if (ptr_tag == mem_tag)
     return true;

diff  --git a/compiler-rt/test/hwasan/TestCases/test_shadow.c b/compiler-rt/test/hwasan/TestCases/test_shadow.c
deleted file mode 100644
index 693ba255a030e..0000000000000
--- a/compiler-rt/test/hwasan/TestCases/test_shadow.c
+++ /dev/null
@@ -1,41 +0,0 @@
-// RUN: %clang_hwasan %s -o %t && %run %t
-
-#include <assert.h>
-#include <sanitizer/hwasan_interface.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-int main() {
-  __hwasan_enable_allocator_tagging();
-  for (int sz = 0; sz < 64; ++sz) {
-    fprintf(stderr, "sz: %d\n", sz);
-    char *x = (char *)malloc(sz);
-    do {
-      // Empty range is always OK.
-      for (int b = -16; b < sz + 32; ++b)
-        assert(__hwasan_test_shadow(x + b, 0) == -1);
-
-      int real_sz = sz ? sz : 1;
-      // Unlucky case when we cant distinguish between tag and short granule size.
-      if (__hwasan_tag_pointer(x, real_sz % 16) == x)
-        break;
-
-      // Underflow - the first byte is bad.
-      for (int b = -16; b < 0; ++b)
-        assert(__hwasan_test_shadow(x + b, real_sz) == 0);
-
-      // Inbound ranges.
-      for (int b = 0; b < real_sz; ++b)
-        for (int e = b; e <= real_sz; ++e)
-          assert(__hwasan_test_shadow(x + b, e - b) == -1);
-
-      // Overflow - the first byte after the buffer is bad.
-      for (int b = 0; b <= real_sz; ++b)
-        for (int e = real_sz + 1; e <= real_sz + 64; ++e)
-          assert(__hwasan_test_shadow(x + b, e - b) == (real_sz - b));
-
-    } while (0);
-    free(x);
-  }
-  return 0;
-}


        


More information about the llvm-commits mailing list