xref: /llvm-project/compiler-rt/test/sanitizer_common/TestCases/Linux/open_memstream.cpp (revision f67fc3acad70c20d8088b72ee9563690c8ab9be0)
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