summaryrefslogtreecommitdiff
path: root/test/scudo
diff options
context:
space:
mode:
authorKostya Kortchinsky <kostyak@google.com>2017-06-29 16:45:20 +0000
committerKostya Kortchinsky <kostyak@google.com>2017-06-29 16:45:20 +0000
commit5d77c239d28020aa3c2e243e009e20e35c98f86e (patch)
tree6d20d9f6162f661eefafe8a6a2bded4c891a5952 /test/scudo
parenta05e4630f35a14d8db97417cdb6b959f2781b4f9 (diff)
[scudo] Change aligned alloc functions to be more compliant & perf changes
Summary: We were not following the `man` documented behaviors for invalid arguments to `memalign` and associated functions. Using `CHECK` for those was a bit extreme, so we relax the behavior to return null pointers as expected when this happens. Adapt the associated test. I am using this change also to change a few more minor performance improvements: - mark as `UNLIKELY` a bunch of unlikely conditions; - the current `CHECK` in `__sanitizer::RoundUpTo` is redundant for us in *all* calls. So I am introducing our own version without said `CHECK`. - change our combined allocator `GetActuallyAllocatedSize`. We already know if the pointer is from the Primary or Secondary, so the `PointerIsMine` check is redundant as well, and costly for the 32-bit Primary. So we get the size by directly using the available Primary functions. Finally, change a `int` to `uptr` to avoid a warning/error when compiling on Android. Reviewers: alekseyshl Reviewed By: alekseyshl Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D34782 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@306698 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/scudo')
-rw-r--r--test/scudo/memalign.cpp24
1 files changed, 19 insertions, 5 deletions
diff --git a/test/scudo/memalign.cpp b/test/scudo/memalign.cpp
index c263da75e..856128f24 100644
--- a/test/scudo/memalign.cpp
+++ b/test/scudo/memalign.cpp
@@ -1,11 +1,12 @@
// RUN: %clang_scudo %s -o %t
-// RUN: %run %t valid 2>&1
-// RUN: not %run %t invalid 2>&1 | FileCheck %s
+// RUN: %run %t valid 2>&1
+// RUN: %run %t invalid 2>&1
// Tests that the various aligned allocation functions work as intended. Also
// tests for the condition where the alignment is not a power of 2.
#include <assert.h>
+#include <errno.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
@@ -24,6 +25,7 @@ int main(int argc, char **argv)
void *p = nullptr;
size_t alignment = 1U << 12;
size_t size = 1U << 12;
+ int err;
assert(argc == 2);
@@ -57,10 +59,22 @@ int main(int argc, char **argv)
}
}
if (!strcmp(argv[1], "invalid")) {
+ // Alignment is not a power of 2.
p = memalign(alignment - 1, size);
- free(p);
+ assert(!p);
+ // Size is not a multiple of alignment.
+ p = aligned_alloc(alignment, size >> 1);
+ assert(!p);
+ p = (void *)0x42UL;
+ // Alignment is not a power of 2.
+ err = posix_memalign(&p, 3, size);
+ assert(!p);
+ assert(err == EINVAL);
+ p = (void *)0x42UL;
+ // Alignment is a power of 2, but not a multiple of size(void *).
+ err = posix_memalign(&p, 2, size);
+ assert(!p);
+ assert(err == EINVAL);
}
return 0;
}
-
-// CHECK: ERROR: alignment is not a power of 2