diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:11:54 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:11:54 +0000 |
commit | cdf4f3055e964bb585f294cf77cb549ead82783f (patch) | |
tree | 7bceeca766b3fbe491245bc926a083f78c35d1de /test/scudo/preinit.c | |
parent | 625108084a3ec7c19c7745004c5af0ed7aa417a9 (diff) |
Diffstat (limited to 'test/scudo/preinit.c')
-rw-r--r-- | test/scudo/preinit.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/test/scudo/preinit.c b/test/scudo/preinit.c new file mode 100644 index 0000000000000..792b2368e37d0 --- /dev/null +++ b/test/scudo/preinit.c @@ -0,0 +1,40 @@ +// RUN: %clang_scudo %s -o %t +// RUN: %run %t 2>&1 + +// Verifies that calling malloc in a preinit_array function succeeds, and that +// the resulting pointer can be freed at program termination. + +// On some Android versions, calling mmap() from a preinit function segfaults. +// It looks like __mmap2.S ends up calling a NULL function pointer. +// UNSUPPORTED: android + +#include <assert.h> +#include <stdlib.h> +#include <string.h> + +static void *global_p = NULL; + +void __init(void) { + global_p = malloc(1); + if (!global_p) + exit(1); +} + +void __fini(void) { + if (global_p) + free(global_p); +} + +int main(int argc, char **argv) +{ + void *p = malloc(1); + assert(p); + free(p); + + return 0; +} + +__attribute__((section(".preinit_array"), used)) + void (*__local_preinit)(void) = __init; +__attribute__((section(".fini_array"), used)) + void (*__local_fini)(void) = __fini; |