12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Test that large memset/memcpy/memmove check the entire range.
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O0 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMSET
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O1 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMSET
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O2 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMSET
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O3 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMSET
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O0 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \
132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMCPY
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O1 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMCPY
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O2 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMCPY
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O3 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMCPY
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O0 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMMOVE
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O1 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMMOVE
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O2 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMMOVE
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O3 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMMOVE
292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O2 -DTEST_MEMCPY_SIZE_OVERFLOW %s -o %t && not %run %t 2>&1 | \
312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN:     FileCheck %s --check-prefix=CHECK-MEMCPY_SIZE_OVERFLOW
322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <assert.h>
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <string.h>
352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdlib.h>
362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h>
372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sanitizer/asan_interface.h>
392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef void *(*memcpy_t)(void *, const void *, size_t);
412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main(int argc, char **argv) {
432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char * volatile p = (char *)malloc(3000);
442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  __asan_poison_memory_region(p + 512, 16);
452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if defined(TEST_MEMSET)
462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  memset(p, 0, 3000);
472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  assert(p[1] == 0);
482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // CHECK-MEMSET: AddressSanitizer: use-after-poison on address
492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // CHECK-MEMSET: in {{.*}}memset
502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else
512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  char * volatile q = (char *)malloc(3000);
522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if defined(TEST_MEMCPY)
532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  memcpy(q, p, 3000);
542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // CHECK-MEMCPY: AddressSanitizer: use-after-poison on address
552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // On Mac, memmove and memcpy are the same. Accept either one.
562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // CHECK-MEMCPY: in {{.*(memmove|memcpy)}}
572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#elif defined(TEST_MEMMOVE)
582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  memmove(q, p, 3000);
592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // CHECK-MEMMOVE: AddressSanitizer: use-after-poison on address
602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // CHECK-MEMMOVE: in {{.*(memmove|memcpy)}}
612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#elif defined(TEST_MEMCPY_SIZE_OVERFLOW)
622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  volatile memcpy_t my_memcpy = &memcpy;
632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  my_memcpy(p, q, -argc);
642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  // CHECK-MEMCPY_SIZE_OVERFLOW: AddressSanitizer: negative-size-param: (size=-1)
652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  assert(q[1] == 0);
672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  free(q);
682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  free(p);
702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  return 0;
712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
72