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
44 lines
1.6 KiB
C++
44 lines
1.6 KiB
C++
// RUN: %clangxx %collect_stack_traces -O0 %s -o %t
|
|
|
|
// Alignment is not a power of 2:
|
|
// RUN: %env_tool_opts=allocator_may_return_null=0 not %run %t 17 2>&1 | FileCheck %s
|
|
// Size is not a multiple of alignment:
|
|
// RUN: %env_tool_opts=allocator_may_return_null=0 not %run %t 8 2>&1 | FileCheck %s
|
|
// Alignment is 0:
|
|
// RUN: %env_tool_opts=allocator_may_return_null=0 not %run %t 0 2>&1 | FileCheck %s
|
|
|
|
// The same for allocator_may_return_null=1:
|
|
// RUN: %env_tool_opts=allocator_may_return_null=1 %run %t 17 2>&1 | FileCheck %s --check-prefix=CHECK-NULL
|
|
// RUN: %env_tool_opts=allocator_may_return_null=1 %run %t 8 2>&1 | FileCheck %s --check-prefix=CHECK-NULL
|
|
// RUN: %env_tool_opts=allocator_may_return_null=1 %run %t 0 2>&1 | FileCheck %s --check-prefix=CHECK-NULL
|
|
|
|
// REQUIRES: stable-runtime
|
|
|
|
// UNSUPPORTED: android, ubsan
|
|
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
extern void *aligned_alloc(size_t alignment, size_t size);
|
|
|
|
int main(int argc, char **argv) {
|
|
assert(argc == 2);
|
|
const int alignment = atoi(argv[1]);
|
|
|
|
void *p = aligned_alloc(alignment, 100);
|
|
// CHECK: {{ERROR: .*Sanitizer: invalid alignment requested in aligned_alloc}}
|
|
// Handle a case when aligned_alloc is aliased by memalign.
|
|
// CHECK: {{#0 .*}}{{aligned_alloc|memalign}}
|
|
// CHECK: {{#1 .*main .*aligned_alloc-alignment.cc:}}[[@LINE-4]]
|
|
// CHECK: {{SUMMARY: .*Sanitizer: invalid-aligned-alloc-alignment}}
|
|
|
|
// 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: 22, p: 0
|
|
|
|
return 0;
|
|
}
|