diff options
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 000000000..792b2368e --- /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; |