[compiler-rt] make mmap-munmap interceptor fail earlier (PR #169775)

via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 27 13:59:29 PST 2025


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff origin/main HEAD --extensions cpp,h -- compiler-rt/test/asan/TestCases/asan_mmap_oob_aix.cpp compiler-rt/lib/asan/asan_errors.cpp compiler-rt/lib/asan/asan_errors.h compiler-rt/lib/asan/asan_interceptors.cpp compiler-rt/lib/asan/asan_report.cpp compiler-rt/lib/asan/asan_report.h --diff_from_common_commit
``````````

:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/compiler-rt/lib/asan/asan_errors.cpp b/compiler-rt/lib/asan/asan_errors.cpp
index 2a949a14b..0cc747855 100644
--- a/compiler-rt/lib/asan/asan_errors.cpp
+++ b/compiler-rt/lib/asan/asan_errors.cpp
@@ -269,8 +269,10 @@ void ErrorAllocationSizeTooBig::Print() {
 void ErrorMmapAddrOverflow::Print() {
   Decorator d;
   Printf("%s", d.Error());
-  Report("ERROR: AddressSanitizer: mmap requested memory range (0x%zx + 0x%zx) "
-         "causes address overflow\n", start, length);
+  Report(
+      "ERROR: AddressSanitizer: mmap requested memory range (0x%zx + 0x%zx) "
+      "causes address overflow\n",
+      start, length);
   Printf("%s", d.Default());
   stack->Print();
   PrintHintAllocatorCannotReturnNull();
@@ -280,19 +282,23 @@ void ErrorMmapAddrOverflow::Print() {
 void ErrorMmapShadowOverlap::Print() {
   Decorator d;
   Printf("%s", d.Error());
-  Report("ERROR: AddressSanitizer: mmap requested memory range 0x%zx-0x%zx "
-         "overlaps with ASan shadow memory\n", start, end);
+  Report(
+      "ERROR: AddressSanitizer: mmap requested memory range 0x%zx-0x%zx "
+      "overlaps with ASan shadow memory\n",
+      start, end);
   Printf("%s", d.Default());
   stack->Print();
   PrintHintAllocatorCannotReturnNull();
-  ReportErrorSummary(scariness.GetDescription(), stack); 
+  ReportErrorSummary(scariness.GetDescription(), stack);
 }
 
 void ErrorMmapOutsideRange::Print() {
   Decorator d;
   Printf("%s", d.Error());
-  Report("ERROR: AddressSanitizer: mmap requested memory range 0x%zx-0x%zx is "
-         "outside ASan's instrumentable application memory range\n", start, end);
+  Report(
+      "ERROR: AddressSanitizer: mmap requested memory range 0x%zx-0x%zx is "
+      "outside ASan's instrumentable application memory range\n",
+      start, end);
   Printf("%s", d.Default());
   stack->Print();
   PrintHintAllocatorCannotReturnNull();
@@ -302,8 +308,10 @@ void ErrorMmapOutsideRange::Print() {
 void ErrorMunmapShadowOverlap::Print() {
   Decorator d;
   Printf("%s", d.Error());
-  Report("ERROR: AddressSanitizer: munmap requested memory range 0x%zx-0x%zx "
-         "overlaps with ASan shadow memory\n", start, end);
+  Report(
+      "ERROR: AddressSanitizer: munmap requested memory range 0x%zx-0x%zx "
+      "overlaps with ASan shadow memory\n",
+      start, end);
   Printf("%s", d.Default());
   stack->Print();
   PrintHintAllocatorCannotReturnNull();
@@ -313,8 +321,10 @@ void ErrorMunmapShadowOverlap::Print() {
 void ErrorMunmapOutsideRange::Print() {
   Decorator d;
   Printf("%s", d.Error());
-  Report("ERROR: AddressSanitizer: munmap requested memory range 0x%zx-0x%zx is "
-         "outside ASan's instrumentable application memory range\n", start, end);
+  Report(
+      "ERROR: AddressSanitizer: munmap requested memory range 0x%zx-0x%zx is "
+      "outside ASan's instrumentable application memory range\n",
+      start, end);
   Printf("%s", d.Default());
   stack->Print();
   PrintHintAllocatorCannotReturnNull();
diff --git a/compiler-rt/lib/asan/asan_errors.h b/compiler-rt/lib/asan/asan_errors.h
index 13e66865a..035f2872d 100644
--- a/compiler-rt/lib/asan/asan_errors.h
+++ b/compiler-rt/lib/asan/asan_errors.h
@@ -250,62 +250,67 @@ struct ErrorAllocationSizeTooBig : ErrorBase {
 };
 
 struct ErrorMmapAddrOverflow : ErrorBase {
-  const BufferedStackTrace *stack;
+  const BufferedStackTrace* stack;
   uptr start;
   uptr length;
   ErrorMmapAddrOverflow() = default;
-  ErrorMmapAddrOverflow(u32 tid, BufferedStackTrace *stack_, uptr start_, uptr len)
-      : ErrorBase(tid, 10, "bad-mmap-overflow"), 
-        stack(stack_), 
-        start(start_), 
+  ErrorMmapAddrOverflow(u32 tid, BufferedStackTrace* stack_, uptr start_,
+                        uptr len)
+      : ErrorBase(tid, 10, "bad-mmap-overflow"),
+        stack(stack_),
+        start(start_),
         length(len) {}
   void Print();
 };
 
 struct ErrorMmapShadowOverlap : ErrorBase {
-  const BufferedStackTrace *stack;
+  const BufferedStackTrace* stack;
   uptr start, end;
   ErrorMmapShadowOverlap() = default;
-  ErrorMmapShadowOverlap(u32 tid, BufferedStackTrace *stack_, uptr start_, uptr end_)
-      : ErrorBase(tid, 10, "bad-mmap-overlap"), 
-        stack(stack_), 
-        start(start_), 
+  ErrorMmapShadowOverlap(u32 tid, BufferedStackTrace* stack_, uptr start_,
+                         uptr end_)
+      : ErrorBase(tid, 10, "bad-mmap-overlap"),
+        stack(stack_),
+        start(start_),
         end(end_) {}
   void Print();
 };
 
 struct ErrorMmapOutsideRange : ErrorBase {
-  const BufferedStackTrace *stack;
+  const BufferedStackTrace* stack;
   uptr start, end;
   ErrorMmapOutsideRange() = default;
-  ErrorMmapOutsideRange(u32 tid, BufferedStackTrace *stack_, uptr start_, uptr end_)
-      : ErrorBase(tid, 10, "bad-mmap-out-of-range"), 
-        stack(stack_), 
-        start(start_), 
+  ErrorMmapOutsideRange(u32 tid, BufferedStackTrace* stack_, uptr start_,
+                        uptr end_)
+      : ErrorBase(tid, 10, "bad-mmap-out-of-range"),
+        stack(stack_),
+        start(start_),
         end(end_) {}
   void Print();
 };
 
 struct ErrorMunmapShadowOverlap : ErrorBase {
-  const BufferedStackTrace *stack;
+  const BufferedStackTrace* stack;
   uptr start, end;
   ErrorMunmapShadowOverlap() = default;
-  ErrorMunmapShadowOverlap(u32 tid, BufferedStackTrace *stack_, uptr start_, uptr end_)
-      : ErrorBase(tid, 10, "bad-munmap-overlap"), 
-        stack(stack_), 
-        start(start_), 
+  ErrorMunmapShadowOverlap(u32 tid, BufferedStackTrace* stack_, uptr start_,
+                           uptr end_)
+      : ErrorBase(tid, 10, "bad-munmap-overlap"),
+        stack(stack_),
+        start(start_),
         end(end_) {}
   void Print();
 };
 
 struct ErrorMunmapOutsideRange : ErrorBase {
-  const BufferedStackTrace *stack;
+  const BufferedStackTrace* stack;
   uptr start, end;
   ErrorMunmapOutsideRange() = default;
-  ErrorMunmapOutsideRange(u32 tid, BufferedStackTrace *stack_, uptr start_, uptr end_)
-      : ErrorBase(tid, 10, "bad-munmap-out-of-range"), 
-        stack(stack_), 
-        start(start_), 
+  ErrorMunmapOutsideRange(u32 tid, BufferedStackTrace* stack_, uptr start_,
+                          uptr end_)
+      : ErrorBase(tid, 10, "bad-munmap-out-of-range"),
+        stack(stack_),
+        start(start_),
         end(end_) {}
   void Print();
 };
diff --git a/compiler-rt/lib/asan/asan_interceptors.cpp b/compiler-rt/lib/asan/asan_interceptors.cpp
index 5cd586305..f127a0e8e 100644
--- a/compiler-rt/lib/asan/asan_interceptors.cpp
+++ b/compiler-rt/lib/asan/asan_interceptors.cpp
@@ -12,7 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "asan_interceptors.h"
-#include "sanitizer_common/sanitizer_common.h"
+
 #include "asan_allocator.h"
 #include "asan_internal.h"
 #include "asan_mapping.h"
@@ -23,6 +23,7 @@
 #include "asan_suppressions.h"
 #include "asan_thread.h"
 #include "lsan/lsan_common.h"
+#include "sanitizer_common/sanitizer_common.h"
 #include "sanitizer_common/sanitizer_errno.h"
 #include "sanitizer_common/sanitizer_internal_defs.h"
 #include "sanitizer_common/sanitizer_libc.h"
@@ -47,11 +48,11 @@
 #    define ASAN_PTHREAD_CREATE_VERSION "GLIBC_2.2"
 #  endif
 
-#if !defined(MAP_FAILED)
-#  define MAP_FAILED ((void *)-1)
-#endif
+#  if !defined(MAP_FAILED)
+#    define MAP_FAILED ((void*)-1)
+#  endif
 
-#define MAP_FIXED        0x0010 /* [MF|SHM] interpret addr exactly */
+#  define MAP_FIXED 0x0010 /* [MF|SHM] interpret addr exactly */
 
 namespace __asan {
 
@@ -93,22 +94,33 @@ int OnExit() {
   return 0;
 }
 
-static inline bool RangeOverlaps(uptr beg, uptr end_excl, uptr seg_beg, uptr seg_end_incl) {
-  if (!seg_beg && !seg_end_incl) return false;
+static inline bool RangeOverlaps(uptr beg, uptr end_excl, uptr seg_beg,
+                                 uptr seg_end_incl) {
+  if (!seg_beg && !seg_end_incl)
+    return false;
   uptr seg_end_excl = seg_end_incl + 1;
   return beg < seg_end_excl && end_excl > seg_beg;
 }
 
 static inline bool IntersectsShadowOrGap(uptr beg, uptr end_excl) {
   // Check shadow regions
-  if (RangeOverlaps(beg, end_excl, kLowShadowBeg, kLowShadowEnd)) return true;
-  if (kMidShadowBeg && RangeOverlaps(beg, end_excl, kMidShadowBeg, kMidShadowEnd)) return true;
-  if (RangeOverlaps(beg, end_excl, kHighShadowBeg, kHighShadowEnd)) return true;
+  if (RangeOverlaps(beg, end_excl, kLowShadowBeg, kLowShadowEnd))
+    return true;
+  if (kMidShadowBeg &&
+      RangeOverlaps(beg, end_excl, kMidShadowBeg, kMidShadowEnd))
+    return true;
+  if (RangeOverlaps(beg, end_excl, kHighShadowBeg, kHighShadowEnd))
+    return true;
 
   // Check shadow gaps
-  if (RangeOverlaps(beg, end_excl, kShadowGapBeg, kShadowGapEnd)) return true;
-  if (kShadowGap2Beg && RangeOverlaps(beg, end_excl, kShadowGap2Beg, kShadowGap2End)) return true;
-  if (kShadowGap3Beg && RangeOverlaps(beg, end_excl, kShadowGap3Beg, kShadowGap3End)) return true;
+  if (RangeOverlaps(beg, end_excl, kShadowGapBeg, kShadowGapEnd))
+    return true;
+  if (kShadowGap2Beg &&
+      RangeOverlaps(beg, end_excl, kShadowGap2Beg, kShadowGap2End))
+    return true;
+  if (kShadowGap3Beg &&
+      RangeOverlaps(beg, end_excl, kShadowGap3Beg, kShadowGap3End))
+    return true;
 
   return false;
 }
@@ -183,7 +195,7 @@ DECLARE_REAL_AND_INTERCEPTOR(void, free, void *)
     }
 
 template <class Mmap>
-static void *mmap_interceptor(Mmap real_mmap, void *addr, SIZE_T length,
+static void* mmap_interceptor(Mmap real_mmap, void* addr, SIZE_T length,
                               int prot, int flags, int fd, OFF64_T offset) {
   if (length == 0)
     return real_mmap(addr, length, prot, flags, fd, offset);
@@ -200,7 +212,7 @@ static void *mmap_interceptor(Mmap real_mmap, void *addr, SIZE_T length,
     if (__asan::IntersectsShadowOrGap(start, end_excl)) {
       errno = errno_EINVAL;
       GET_STACK_TRACE_FATAL_HERE;
-      ReportMmapShadowOverlap(start, end_excl, &stack);      
+      ReportMmapShadowOverlap(start, end_excl, &stack);
       if (common_flags()->abort_on_error) {
         Abort();
       }
@@ -264,18 +276,19 @@ static int munmap_interceptor(Munmap real_munmap, void *addr, SIZE_T length) {
   return res;
 }
 
-#  define COMMON_INTERCEPTOR_MMAP_IMPL(ctx, mmap, addr, length, prot, flags,   \
-                                     fd, offset)                               \
-  do {                                                                         \
-    (void)(ctx);                                                               \
-    return mmap_interceptor(REAL(mmap), addr, length, prot, flags, fd, offset);\
-  } while (false)
+#  define COMMON_INTERCEPTOR_MMAP_IMPL(ctx, mmap, addr, length, prot, flags, \
+                                       fd, offset)                           \
+    do {                                                                     \
+      (void)(ctx);                                                           \
+      return mmap_interceptor(REAL(mmap), addr, length, prot, flags, fd,     \
+                              offset);                                       \
+    } while (false)
 
-#  define COMMON_INTERCEPTOR_MUNMAP_IMPL(ctx, addr, length)                    \
-  do {                                                                         \
-    (void)(ctx);                                                               \
-    return munmap_interceptor(REAL(munmap), addr, length);                     \
-  } while (false)
+#  define COMMON_INTERCEPTOR_MUNMAP_IMPL(ctx, addr, length)  \
+    do {                                                     \
+      (void)(ctx);                                           \
+      return munmap_interceptor(REAL(munmap), addr, length); \
+    } while (false)
 
 #if CAN_SANITIZE_LEAKS
 #define COMMON_INTERCEPTOR_STRERROR()                       \
diff --git a/compiler-rt/lib/asan/asan_report.cpp b/compiler-rt/lib/asan/asan_report.cpp
index fbefc63b4..53594b7b3 100644
--- a/compiler-rt/lib/asan/asan_report.cpp
+++ b/compiler-rt/lib/asan/asan_report.cpp
@@ -343,31 +343,33 @@ void ReportAllocationSizeTooBig(uptr user_size, uptr total_size, uptr max_size,
   in_report.ReportError(error);
 }
 
-void ReportMmapAddrOverflow(uptr start, uptr length, BufferedStackTrace *stack) {
+void ReportMmapAddrOverflow(uptr start, uptr length,
+                            BufferedStackTrace* stack) {
   ScopedInErrorReport in_report(/*fatal*/ true);
   ErrorMmapAddrOverflow error(GetCurrentTidOrInvalid(), stack, start, length);
   in_report.ReportError(error);
 }
 
-void ReportMmapShadowOverlap(uptr start, uptr end, BufferedStackTrace *stack) {
+void ReportMmapShadowOverlap(uptr start, uptr end, BufferedStackTrace* stack) {
   ScopedInErrorReport in_report(/*fatal*/ true);
   ErrorMmapShadowOverlap error(GetCurrentTidOrInvalid(), stack, start, end);
   in_report.ReportError(error);
 }
 
-void ReportMmapOutsideRange(uptr start, uptr end, BufferedStackTrace *stack) {
+void ReportMmapOutsideRange(uptr start, uptr end, BufferedStackTrace* stack) {
   ScopedInErrorReport in_report(/*fatal*/ true);
   ErrorMmapOutsideRange error(GetCurrentTidOrInvalid(), stack, start, end);
   in_report.ReportError(error);
 }
 
-void ReportMunmapShadowOverlap(uptr start, uptr end, BufferedStackTrace *stack) {
+void ReportMunmapShadowOverlap(uptr start, uptr end,
+                               BufferedStackTrace* stack) {
   ScopedInErrorReport in_report(/*fatal*/ true);
   ErrorMunmapShadowOverlap error(GetCurrentTidOrInvalid(), stack, start, end);
   in_report.ReportError(error);
 }
 
-void ReportMunmapOutsideRange(uptr start, uptr end, BufferedStackTrace *stack) {
+void ReportMunmapOutsideRange(uptr start, uptr end, BufferedStackTrace* stack) {
   ScopedInErrorReport in_report(/*fatal*/ true);
   ErrorMunmapOutsideRange error(GetCurrentTidOrInvalid(), stack, start, end);
   in_report.ReportError(error);
diff --git a/compiler-rt/lib/asan/asan_report.h b/compiler-rt/lib/asan/asan_report.h
index e7f653cf6..c50783fed 100644
--- a/compiler-rt/lib/asan/asan_report.h
+++ b/compiler-rt/lib/asan/asan_report.h
@@ -73,11 +73,11 @@ void ReportInvalidPosixMemalignAlignment(uptr alignment,
                                          BufferedStackTrace *stack);
 void ReportAllocationSizeTooBig(uptr user_size, uptr total_size, uptr max_size,
                                 BufferedStackTrace *stack);
-void ReportMmapAddrOverflow(uptr start, uptr length, BufferedStackTrace *stack);
-void ReportMmapShadowOverlap(uptr start, uptr end, BufferedStackTrace *stack);
-void ReportMmapOutsideRange(uptr start, uptr end, BufferedStackTrace *stack);
-void ReportMunmapShadowOverlap(uptr start, uptr end, BufferedStackTrace *stack);
-void ReportMunmapOutsideRange(uptr start, uptr end, BufferedStackTrace *stack);                                
+void ReportMmapAddrOverflow(uptr start, uptr length, BufferedStackTrace* stack);
+void ReportMmapShadowOverlap(uptr start, uptr end, BufferedStackTrace* stack);
+void ReportMmapOutsideRange(uptr start, uptr end, BufferedStackTrace* stack);
+void ReportMunmapShadowOverlap(uptr start, uptr end, BufferedStackTrace* stack);
+void ReportMunmapOutsideRange(uptr start, uptr end, BufferedStackTrace* stack);
 void ReportRssLimitExceeded(BufferedStackTrace *stack);
 void ReportOutOfMemory(uptr requested_size, BufferedStackTrace *stack);
 void ReportStringFunctionMemoryRangesOverlap(const char *function,
diff --git a/compiler-rt/test/asan/TestCases/asan_mmap_oob_aix.cpp b/compiler-rt/test/asan/TestCases/asan_mmap_oob_aix.cpp
index 5833159f0..6c9229cfe 100644
--- a/compiler-rt/test/asan/TestCases/asan_mmap_oob_aix.cpp
+++ b/compiler-rt/test/asan/TestCases/asan_mmap_oob_aix.cpp
@@ -5,12 +5,13 @@
 #define ASAN_AIX_SHADOW_OFFSET 0x0a01000000000000ULL
 
 int main() {
-    size_t map_size = 4096;
-    void* addr = (void*)ASAN_AIX_SHADOW_OFFSET;
-    void* ptr = mmap(addr, map_size, PROT_READ | PROT_WRITE,
-                     MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
-    if (ptr != MAP_FAILED) munmap(ptr, map_size);
-    return 0;
+  size_t map_size = 4096;
+  void *addr = (void *)ASAN_AIX_SHADOW_OFFSET;
+  void *ptr = mmap(addr, map_size, PROT_READ | PROT_WRITE,
+                   MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+  if (ptr != MAP_FAILED)
+    munmap(ptr, map_size);
+  return 0;
 }
 
 // CHECK: ERROR: AddressSanitizer: mmap requested memory range

``````````

</details>


https://github.com/llvm/llvm-project/pull/169775


More information about the llvm-commits mailing list