Fix some page size assumptions in the HWASan tests.

Reviewers: fmayer, vitalybuka

Reviewed By: fmayer, vitalybuka

Pull Request: https://github.com/llvm/llvm-project/pull/134941
This commit is contained in:
Peter Collingbourne 2025-04-08 16:13:41 -07:00 committed by GitHub
parent 9c38b2e513
commit 0428252db3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 21 additions and 13 deletions

View File

@ -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,18 @@
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 +47,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 +61,14 @@ 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;

View File

@ -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
//

View File

@ -7,15 +7,17 @@
#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,
-1, 0);
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");
abort();