mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 15:36:05 +00:00

Userspace page aliasing allows us to use middle pointer bits for tags without untagging them before syscalls or accesses. This should enable easier experimentation with HWASan on x86_64 platforms. Currently stack, global, and secondary heap tagging are unsupported. Only primary heap allocations get tagged. Note that aliasing mode will not work properly in the presence of fork(), since heap memory will be shared between the parent and child processes. This mode is non-ideal; we expect Intel LAM to enable full HWASan support on x86_64 in the future. Reviewed By: vitalybuka, eugenis Differential Revision: https://reviews.llvm.org/D98875
47 lines
1.4 KiB
C++
47 lines
1.4 KiB
C++
// RUN: %clangxx_hwasan -O0 %s -o %t
|
|
// RUN: %env_hwasan_opts=allocator_may_return_null=0 not %run %t m1 2>&1 | FileCheck %s
|
|
// RUN: %env_hwasan_opts=allocator_may_return_null=1 %run %t m1 2>&1 | FileCheck %s --check-prefix=CHECK-NULL
|
|
// RUN: %env_hwasan_opts=allocator_may_return_null=0 not %run %t psm1 2>&1 | FileCheck %s
|
|
// RUN: %env_hwasan_opts=allocator_may_return_null=1 %run %t psm1 2>&1 | FileCheck %s --check-prefix=CHECK-NULL
|
|
|
|
// UNSUPPORTED: android
|
|
|
|
// REQUIRES: stable-runtime
|
|
|
|
// Checks that pvalloc overflows are caught. If the allocator is allowed to
|
|
// return null, the errno should be set to ENOMEM.
|
|
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
#include <malloc.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
int main(int argc, char *argv[]) {
|
|
assert(argc == 2);
|
|
const char *action = argv[1];
|
|
|
|
const size_t page_size = sysconf(_SC_PAGESIZE);
|
|
|
|
void *p = nullptr;
|
|
if (!strcmp(action, "m1")) {
|
|
p = pvalloc((uintptr_t)-1);
|
|
} else if (!strcmp(action, "psm1")) {
|
|
p = pvalloc((uintptr_t)-(page_size - 1));
|
|
} else {
|
|
assert(0);
|
|
}
|
|
|
|
fprintf(stderr, "errno: %d\n", errno);
|
|
|
|
return p != nullptr;
|
|
}
|
|
|
|
// CHECK: {{ERROR: HWAddressSanitizer: pvalloc parameters overflow: size .* rounded up to system page size .* cannot be represented in type size_t}}
|
|
// CHECK: {{#0 0x.* in .*pvalloc}}
|
|
// CHECK: {{#1 0x.* in main .*pvalloc-overflow.cpp:}}
|
|
// CHECK: SUMMARY: HWAddressSanitizer: pvalloc-overflow
|
|
|
|
// CHECK-NULL: errno: 12
|