12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This test program creates a very large number of unique histories. 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 35d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Heap origin. 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -m64 -O3 %s -o %t 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK2 < %t.out 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 155d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Stack origin. 165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_msan -DSTACK -fsanitize-memory-track-origins=2 -m64 -O3 %s -o %t 175d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 195d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 205d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 215d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 225d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK2 < %t.out 235d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 245d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 255d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out 265d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 275d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 285d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Heap origin, with calls. 295d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_msan -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -m64 -O3 %s -o %t 305d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 315d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 325d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 335d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 345d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 355d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK2 < %t.out 365d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 375d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 385d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out 395d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 405d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 415d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Stack origin, with calls. 425d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clangxx_msan -DSTACK -mllvm -msan-instrumentation-with-call-threshold=0 -fsanitize-memory-track-origins=2 -m64 -O3 %s -o %t 435d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 445d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: MSAN_OPTIONS=origin_history_size=7 not %run %t >%t.out 2>&1 455d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK7 < %t.out 465d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 475d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: MSAN_OPTIONS=origin_history_size=2 not %run %t >%t.out 2>&1 485d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK2 < %t.out 495d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 505d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: MSAN_OPTIONS=origin_history_per_stack_limit=1 not %run %t >%t.out 2>&1 515d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: FileCheck %s --check-prefix=CHECK-PER-STACK < %t.out 525d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h> 542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdlib.h> 552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <string.h> 562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <unistd.h> 572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstatic char *buf, *cur, *end; 592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid init() { 602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines buf = new char[1000]; 615d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#ifdef STACK 625d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines char stackbuf[1000]; 635d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines char *volatile p = stackbuf; 645d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines memcpy(buf, p, 1000); 655d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#endif 662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines cur = buf; 672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines end = buf + 1000; 682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid line_flush() { 712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *p; 722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (p = cur - 1; p >= buf; --p) 732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (*p == '\n') 742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines break; 752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (p >= buf) { 762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines size_t write_sz = p - buf + 1; 772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // write(2, buf, write_sz); 782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines memmove(buf, p + 1, end - p - 1); 792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines cur -= write_sz; 802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid buffered_write(const char *p, size_t sz) { 842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines while (sz > 0) { 852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines size_t copy_sz = end - cur; 862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines if (sz < copy_sz) copy_sz = sz; 872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines memcpy(cur, p, copy_sz); 882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines cur += copy_sz; 892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines sz -= copy_sz; 902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines line_flush(); 912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid fn1() { 952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines buffered_write("a\n", 2); 962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid fn2() { 992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines buffered_write("a\n", 2); 1002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid fn3() { 1032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines buffered_write("a\n", 2); 1042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(void) { 1072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines init(); 1082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines for (int i = 0; i < 2000; ++i) { 1092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fn1(); 1102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fn2(); 1112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fn3(); 1122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 1132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return buf[50]; 1142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 1152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7: WARNING: MemorySanitizer: use-of-uninitialized-value 1172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7-NOT: Uninitialized value was stored to memory at 1182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7: Uninitialized value was stored to memory at 1192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7-NOT: Uninitialized value was stored to memory at 1202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7: Uninitialized value was stored to memory at 1212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7-NOT: Uninitialized value was stored to memory at 1222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7: Uninitialized value was stored to memory at 1232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7-NOT: Uninitialized value was stored to memory at 1242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7: Uninitialized value was stored to memory at 1252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7-NOT: Uninitialized value was stored to memory at 1262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7: Uninitialized value was stored to memory at 1272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7-NOT: Uninitialized value was stored to memory at 1282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7: Uninitialized value was stored to memory at 1292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK7-NOT: Uninitialized value was stored to memory at 1305d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK7: Uninitialized value was created 1312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK2: WARNING: MemorySanitizer: use-of-uninitialized-value 1332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK2-NOT: Uninitialized value was stored to memory at 1342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK2: Uninitialized value was stored to memory at 1352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK2-NOT: Uninitialized value was stored to memory at 1365d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK2: Uninitialized value was created 1372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-PER-STACK: WARNING: MemorySanitizer: use-of-uninitialized-value 1392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-PER-STACK: Uninitialized value was stored to memory at 1402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-PER-STACK: in fn3 1412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-PER-STACK: Uninitialized value was stored to memory at 1422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-PER-STACK: in fn2 1432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-PER-STACK: Uninitialized value was stored to memory at 1442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK-PER-STACK: in fn1 1455d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK-PER-STACK: Uninitialized value was created 146