[compiler-rt] Fix some page size assumptions in the HWASan tests. (PR #134941)

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 8 15:52:49 PDT 2025


https://github.com/pcc created https://github.com/llvm/llvm-project/pull/134941

None

>From 1897b0558fbcb3fc2c66cc0303db0000afd624c2 Mon Sep 17 00:00:00 2001
From: Peter Collingbourne <pcc at google.com>
Date: Tue, 8 Apr 2025 15:52:33 -0700
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
 =?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.6-beta.1
---
 .../hwasan/TestCases/Linux/release-shadow.c   | 20 +++++++++++--------
 .../hwasan/TestCases/heap-buffer-overflow.c   |  4 ++--
 .../TestCases/tag-mismatch-border-address.c   |  6 ++++--
 3 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c b/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c
index 705f5e6f433cc..988de511ae1af 100644
--- a/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c
+++ b/compiler-rt/test/hwasan/TestCases/Linux/release-shadow.c
@@ -7,6 +7,7 @@
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <sys/auxv.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -17,17 +18,17 @@
 const unsigned char kTag = 42;
 const size_t kNumShadowPages = 1024;
 const size_t kNumPages = 16 * kNumShadowPages;
-const size_t kPageSize = 4096;
-const size_t kMapSize = kNumPages * kPageSize;
+
+size_t page_size, map_size;
 
 void sync_rss() {
-  char *page = (char *)mmap(0, kPageSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
+  char *page = (char *)mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
   // Linux kernel updates RSS counters after a set number of page faults.
   for (int i = 0; i < 100; ++i) {
     page[0] = 42;
-    madvise(page, kPageSize, MADV_DONTNEED);
+    madvise(page, page_size, MADV_DONTNEED);
   }
-  munmap(page, kPageSize);
+  munmap(page, page_size);
 }
 
 size_t current_rss() {
@@ -45,9 +46,9 @@ size_t current_rss() {
 }
 
 int test_rss_difference(void *p) {
-  __hwasan_tag_memory(p, kTag, kMapSize);
+  __hwasan_tag_memory(p, kTag, map_size);
   size_t rss_before = current_rss();
-  __hwasan_tag_memory(p, 0, kMapSize);
+  __hwasan_tag_memory(p, 0, map_size);
   size_t rss_after = current_rss();
   fprintf(stderr, "%zu -> %zu\n", rss_before, rss_after);
   if (rss_before <= rss_after)
@@ -59,10 +60,13 @@ int test_rss_difference(void *p) {
 }
 
 int main() {
+  page_size = getauxval(AT_PAGESZ);
+  map_size = kNumPages * page_size;
+
   fprintf(stderr, "starting rss %zu\n", current_rss());
   fprintf(stderr, "shadow pages: %zu\n", kNumShadowPages);
 
-  void *p = mmap(0, kMapSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
+  void *p = mmap(0, map_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
   fprintf(stderr, "p = %p\n", p);
 
   size_t total_count = 10;
diff --git a/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow.c b/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow.c
index d390017dd7555..a4923fa4071cd 100644
--- a/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow.c
+++ b/compiler-rt/test/hwasan/TestCases/heap-buffer-overflow.c
@@ -47,11 +47,11 @@ int main(int argc, char **argv) {
   // CHECKm30: Cause: heap-buffer-overflow
   // CHECKm30: is located 30 bytes before a 30-byte region
   //
-  // CHECKMm30: is a large allocated heap chunk; size: 1003520 offset: -30
+  // CHECKMm30: is a large allocated heap chunk; size: {{[0-9]*}} offset: -30
   // CHECKMm30: Cause: heap-buffer-overflow
   // CHECKMm30: is located 30 bytes before a 1000000-byte region
   //
-  // CHECKM: is a large allocated heap chunk; size: 1003520 offset: 1000000
+  // CHECKM: is a large allocated heap chunk; size: {{[0-9]*}} offset: 1000000
   // CHECKM: Cause: heap-buffer-overflow
   // CHECKM: is located 0 bytes after a 1000000-byte region
   //
diff --git a/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c b/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c
index bffb8a0dfb042..a9fd7d66d8c10 100644
--- a/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c
+++ b/compiler-rt/test/hwasan/TestCases/tag-mismatch-border-address.c
@@ -7,14 +7,16 @@
 #include <sanitizer/hwasan_interface.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <sys/auxv.h>
 #include <sys/mman.h>
 
 static volatile char sink;
 extern void *__hwasan_shadow_memory_dynamic_address;
 
 int main(int argc, char **argv) {
-  void *high_addr = (char *)__hwasan_shadow_memory_dynamic_address - 0x1000;
-  void *r = mmap(high_addr, 4096, PROT_READ, MAP_FIXED | MAP_ANON | MAP_PRIVATE,
+  size_t page_size = getauxval(AT_PAGESZ);
+  void *high_addr = (char *)__hwasan_shadow_memory_dynamic_address - page_size;
+  void *r = mmap(high_addr, page_size, PROT_READ, MAP_FIXED | MAP_ANON | MAP_PRIVATE,
                  -1, 0);
   if (r == MAP_FAILED) {
     fprintf(stderr, "Failed to mmap\n");



More information about the llvm-commits mailing list