Summary: Following up on and complementing D44404 and other sanitizer allocators. Currently many allocator specific errors (OOM, for example) are reported as a text message and CHECK(0) termination, no stack, no details, not too helpful nor informative. To improve the situation, detailed and structured common errors were defined and reported under the appropriate conditions. Common tests were generalized a bit to cover a slightly different TSan stack reporting format, extended to verify errno value and returned pointer value check is now explicit to facilitate debugging. Reviewers: dvyukov Subscribers: srhines, kubamracek, delcypher, #sanitizers, llvm-commits Differential Revision: https://reviews.llvm.org/D48087 llvm-svn: 334975
48 lines
1.6 KiB
C++
48 lines
1.6 KiB
C++
// RUN: %clangxx %collect_stack_traces -O0 %s -o %t
|
|
// RUN: %env_tool_opts=allocator_may_return_null=0 not %run %t m1 2>&1 | FileCheck %s
|
|
// RUN: %env_tool_opts=allocator_may_return_null=1 %run %t m1 2>&1 | FileCheck %s --check-prefix=CHECK-NULL
|
|
// RUN: %env_tool_opts=allocator_may_return_null=0 not %run %t psm1 2>&1 | FileCheck %s
|
|
// RUN: %env_tool_opts=allocator_may_return_null=1 %run %t psm1 2>&1 | FileCheck %s --check-prefix=CHECK-NULL
|
|
|
|
// REQUIRES: stable-runtime
|
|
|
|
// UNSUPPORTED: android, freebsd, netbsd, ubsan
|
|
|
|
// 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 <stdio.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);
|
|
}
|
|
// CHECK: {{ERROR: .*Sanitizer: pvalloc parameters overflow: size .* rounded up to system page size .* cannot be represented in type size_t}}
|
|
// CHECK: {{#0 .*pvalloc}}
|
|
// CHECK: {{#1 .*main .*pvalloc-overflow.cc:}}
|
|
// CHECK: {{SUMMARY: .*Sanitizer: pvalloc-overflow}}
|
|
|
|
// The NULL pointer is printed differently on different systems, while (long)0
|
|
// is always the same.
|
|
fprintf(stderr, "errno: %d, p: %lx\n", errno, (long)p);
|
|
// CHECK-NULL: errno: 12, p: 0
|
|
|
|
return 0;
|
|
}
|