// Test that large memset/memcpy/memmove check the entire range. // RUN: %clangxx_asan -O0 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMSET // RUN: %clangxx_asan -O1 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMSET // RUN: %clangxx_asan -O2 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMSET // RUN: %clangxx_asan -O3 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMSET // RUN: %clangxx_asan -O0 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMCPY // RUN: %clangxx_asan -O1 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMCPY // RUN: %clangxx_asan -O2 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMCPY // RUN: %clangxx_asan -O3 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMCPY // RUN: %clangxx_asan -O0 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMMOVE // RUN: %clangxx_asan -O1 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMMOVE // RUN: %clangxx_asan -O2 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMMOVE // RUN: %clangxx_asan -O3 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMMOVE // RUN: %clangxx_asan -O2 -DTEST_MEMCPY_SIZE_OVERFLOW %s -o %t && not %run %t 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-MEMCPY_SIZE_OVERFLOW #include <assert.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <sanitizer/asan_interface.h> typedef void *(*memcpy_t)(void *, const void *, size_t); int main(int argc, char **argv) { char * volatile p = (char *)malloc(3000); __asan_poison_memory_region(p + 512, 16); #if defined(TEST_MEMSET) memset(p, 0, 3000); assert(p[1] == 0); // CHECK-MEMSET: AddressSanitizer: use-after-poison on address // CHECK-MEMSET: in {{.*}}memset #else char * volatile q = (char *)malloc(3000); #if defined(TEST_MEMCPY) memcpy(q, p, 3000); // CHECK-MEMCPY: AddressSanitizer: use-after-poison on address // On Mac, memmove and memcpy are the same. Accept either one. // CHECK-MEMCPY: in {{.*(memmove|memcpy)}} #elif defined(TEST_MEMMOVE) memmove(q, p, 3000); // CHECK-MEMMOVE: AddressSanitizer: use-after-poison on address // CHECK-MEMMOVE: in {{.*(memmove|memcpy)}} #elif defined(TEST_MEMCPY_SIZE_OVERFLOW) volatile memcpy_t my_memcpy = &memcpy; my_memcpy(p, q, -argc); // CHECK-MEMCPY_SIZE_OVERFLOW: AddressSanitizer: negative-size-param: (size=-1) #endif assert(q[1] == 0); free(q); #endif free(p); return 0; }