174989affSNico Weber // RUN: %clangxx -m64 -O0 -g -xc++ %s -o %t && %run %t
274989affSNico Weber // RUN: %clangxx -m64 -O3 -g -xc++ %s -o %t && %run %t
374989affSNico Weber // REQUIRES: x86_64-target-arch
474989affSNico Weber
574989affSNico Weber #include <assert.h>
674989affSNico Weber #include <stdio.h>
774989affSNico Weber #include <stdlib.h>
874989affSNico Weber #include <string.h>
974989affSNico Weber
10*f67fc3acSVitaly Buka #include "sanitizer_common/sanitizer_specific.h"
1174989affSNico Weber
run(bool flush)1274989affSNico Weber static void run(bool flush) {
1374989affSNico Weber char *buf;
1474989affSNico Weber size_t buf_len;
1574989affSNico Weber fprintf(stderr, " &buf %p, &buf_len %p\n", &buf, &buf_len);
1674989affSNico Weber FILE *fp = open_memstream(&buf, &buf_len);
1774989affSNico Weber fprintf(fp, "hello");
1874989affSNico Weber if (flush) {
1974989affSNico Weber fflush(fp);
2074989affSNico Weber check_mem_is_good(&buf, sizeof(buf));
2174989affSNico Weber check_mem_is_good(&buf_len, sizeof(buf_len));
2274989affSNico Weber check_mem_is_good(buf, buf_len);
2374989affSNico Weber }
2474989affSNico Weber
2574989affSNico Weber char *p = new char[1024];
2674989affSNico Weber memset(p, 'a', 1023);
2774989affSNico Weber p[1023] = 0;
2874989affSNico Weber for (int i = 0; i < 100; ++i)
2974989affSNico Weber fprintf(fp, "%s", p);
3074989affSNico Weber delete[] p;
3174989affSNico Weber
3274989affSNico Weber if (flush) {
3374989affSNico Weber fflush(fp);
3474989affSNico Weber fprintf(stderr, " %p addr %p, len %zu\n", &buf, buf, buf_len);
3574989affSNico Weber check_mem_is_good(&buf, sizeof(buf));
3674989affSNico Weber check_mem_is_good(&buf_len, sizeof(buf_len));
3774989affSNico Weber check_mem_is_good(buf, buf_len);\
3874989affSNico Weber }
3974989affSNico Weber
4074989affSNico Weber fclose(fp);
4174989affSNico Weber check_mem_is_good(&buf, sizeof(buf));
4274989affSNico Weber check_mem_is_good(&buf_len, sizeof(buf_len));
4374989affSNico Weber check_mem_is_good(buf, buf_len);
4474989affSNico Weber
4574989affSNico Weber free(buf);
4674989affSNico Weber }
4774989affSNico Weber
main(void)4874989affSNico Weber int main(void) {
4974989affSNico Weber for (int i = 0; i < 100; ++i)
5074989affSNico Weber run(false);
5174989affSNico Weber for (int i = 0; i < 100; ++i)
5274989affSNico Weber run(true);
5374989affSNico Weber return 0;
5474989affSNico Weber }
55