diff --git a/compiler-rt/lib/hwasan/hwasan_report.cpp b/compiler-rt/lib/hwasan/hwasan_report.cpp --- a/compiler-rt/lib/hwasan/hwasan_report.cpp +++ b/compiler-rt/lib/hwasan/hwasan_report.cpp @@ -624,9 +624,16 @@ Printf("%s of size %zu at %p tags: %02x/%02x (ptr/mem) in thread T%zd\n", is_store ? "WRITE" : "READ", access_size, untagged_addr, ptr_tag, mem_tag, t->unique_id()); + if (mem_tag < kShadowAlignment) { + tag_t *mem_ptr = + reinterpret_cast(ShadowToMem(reinterpret_cast(tag_ptr))); + // The first mismatch was a short granule that matched the ptr_tag. + if (mem_ptr[kShadowAlignment - 1] == ptr_tag) { + offset += mem_tag; + } + } if (offset != 0) - Printf("Invalid access starting at offset [%zu, %zu)\n", offset, - Min(access_size, static_cast(offset) + (1 << kShadowScale))); + Printf("Invalid access starting at offset %zu\n", offset); Printf("%s", d.Default()); stack->Print(); diff --git a/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow-into.c b/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow-into.c --- a/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow-into.c +++ b/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow-into.c @@ -12,6 +12,7 @@ __hwasan_enable_allocator_tagging(); char *volatile x = (char *)malloc(10); memset(x + 5, 0, 26); + // CHECK: Invalid access starting at offset 10 // CHECK: is located 5 bytes inside 10-byte region free(x); }