diff options
Diffstat (limited to 'test/sanitizer_common/TestCases/Linux/open_memstream.cc')
-rw-r--r-- | test/sanitizer_common/TestCases/Linux/open_memstream.cc | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/test/sanitizer_common/TestCases/Linux/open_memstream.cc b/test/sanitizer_common/TestCases/Linux/open_memstream.cc new file mode 100644 index 0000000000000..6abe0bfb14831 --- /dev/null +++ b/test/sanitizer_common/TestCases/Linux/open_memstream.cc @@ -0,0 +1,57 @@ +// RUN: %clangxx -m64 -O0 -g -xc++ %s -o %t && %run %t +// RUN: %clangxx -m64 -O3 -g -xc++ %s -o %t && %run %t + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifndef __has_feature +#define __has_feature(x) 0 +#endif + +#if __has_feature(memory_sanitizer) +#include <sanitizer/msan_interface.h> +static void check_mem_is_good(void *p, size_t s) { + __msan_check_mem_is_initialized(p, s); +} +#elif __has_feature(address_sanitizer) +#include <sanitizer/asan_interface.h> +static void check_mem_is_good(void *p, size_t s) { + assert(__asan_region_is_poisoned(p, s) == 0); +} +#else +static void check_mem_is_good(void *p, size_t s) {} +#endif + +static void run(void) { + char *buf; + size_t buf_len; + fprintf(stderr, " &buf %p, &buf_len %p\n", &buf, &buf_len); + FILE *fp = open_memstream(&buf, &buf_len); + fprintf(fp, "hello"); + fflush(fp); + check_mem_is_good(&buf, sizeof(buf)); + check_mem_is_good(&buf_len, sizeof(buf_len)); + check_mem_is_good(buf, buf_len); + + char *p = new char[1024]; + memset(p, 'a', 1023); + p[1023] = 0; + for (int i = 0; i < 100; ++i) + fprintf(fp, "%s", p); + delete[] p; + fflush(fp); + fprintf(stderr, " %p addr %p, len %zu\n", &buf, buf, buf_len); + check_mem_is_good(&buf, sizeof(buf)); + check_mem_is_good(&buf_len, sizeof(buf_len)); + check_mem_is_good(buf, buf_len); + fclose(fp); + free(buf); +} + +int main(void) { + for (int i = 0; i < 100; ++i) + run(); + return 0; +} |