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