xref: /aosp_15_r20/external/compiler-rt/test/asan/TestCases/memset_test.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot // Test that large memset/memcpy/memmove check the entire range.
2*7c3d14c8STreehugger Robot 
3*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O0 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \
4*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMSET
5*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O1 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \
6*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMSET
7*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O2 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \
8*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMSET
9*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O3 -DTEST_MEMSET %s -o %t && not %run %t 2>&1 | \
10*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMSET
11*7c3d14c8STreehugger Robot 
12*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O0 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \
13*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMCPY
14*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O1 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \
15*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMCPY
16*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O2 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \
17*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMCPY
18*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O3 -DTEST_MEMCPY %s -o %t && not %run %t 2>&1 | \
19*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMCPY
20*7c3d14c8STreehugger Robot 
21*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O0 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \
22*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMMOVE
23*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O1 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \
24*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMMOVE
25*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O2 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \
26*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMMOVE
27*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O3 -DTEST_MEMMOVE %s -o %t && not %run %t 2>&1 | \
28*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMMOVE
29*7c3d14c8STreehugger Robot 
30*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -O2 -DTEST_MEMCPY_SIZE_OVERFLOW %s -o %t && not %run %t 2>&1 | \
31*7c3d14c8STreehugger Robot // RUN:     FileCheck %s --check-prefix=CHECK-MEMCPY_SIZE_OVERFLOW
32*7c3d14c8STreehugger Robot 
33*7c3d14c8STreehugger Robot #include <assert.h>
34*7c3d14c8STreehugger Robot #include <string.h>
35*7c3d14c8STreehugger Robot #include <stdlib.h>
36*7c3d14c8STreehugger Robot #include <stdio.h>
37*7c3d14c8STreehugger Robot 
38*7c3d14c8STreehugger Robot #include <sanitizer/asan_interface.h>
39*7c3d14c8STreehugger Robot 
40*7c3d14c8STreehugger Robot typedef void *(*memcpy_t)(void *, const void *, size_t);
41*7c3d14c8STreehugger Robot 
main(int argc,char ** argv)42*7c3d14c8STreehugger Robot int main(int argc, char **argv) {
43*7c3d14c8STreehugger Robot   char * volatile p = (char *)malloc(3000);
44*7c3d14c8STreehugger Robot   __asan_poison_memory_region(p + 512, 16);
45*7c3d14c8STreehugger Robot #if defined(TEST_MEMSET)
46*7c3d14c8STreehugger Robot   memset(p, 0, 3000);
47*7c3d14c8STreehugger Robot   assert(p[1] == 0);
48*7c3d14c8STreehugger Robot   // CHECK-MEMSET: AddressSanitizer: use-after-poison on address
49*7c3d14c8STreehugger Robot   // CHECK-MEMSET: in {{.*}}memset
50*7c3d14c8STreehugger Robot #else
51*7c3d14c8STreehugger Robot   char * volatile q = (char *)malloc(3000);
52*7c3d14c8STreehugger Robot #if defined(TEST_MEMCPY)
53*7c3d14c8STreehugger Robot   memcpy(q, p, 3000);
54*7c3d14c8STreehugger Robot   // CHECK-MEMCPY: AddressSanitizer: use-after-poison on address
55*7c3d14c8STreehugger Robot   // On Mac, memmove and memcpy are the same. Accept either one.
56*7c3d14c8STreehugger Robot   // CHECK-MEMCPY: in {{.*(memmove|memcpy)}}
57*7c3d14c8STreehugger Robot #elif defined(TEST_MEMMOVE)
58*7c3d14c8STreehugger Robot   memmove(q, p, 3000);
59*7c3d14c8STreehugger Robot   // CHECK-MEMMOVE: AddressSanitizer: use-after-poison on address
60*7c3d14c8STreehugger Robot   // CHECK-MEMMOVE: in {{.*(memmove|memcpy)}}
61*7c3d14c8STreehugger Robot #elif defined(TEST_MEMCPY_SIZE_OVERFLOW)
62*7c3d14c8STreehugger Robot   volatile memcpy_t my_memcpy = &memcpy;
63*7c3d14c8STreehugger Robot   my_memcpy(p, q, -argc);
64*7c3d14c8STreehugger Robot   // CHECK-MEMCPY_SIZE_OVERFLOW: AddressSanitizer: negative-size-param: (size=-1)
65*7c3d14c8STreehugger Robot #endif
66*7c3d14c8STreehugger Robot   assert(q[1] == 0);
67*7c3d14c8STreehugger Robot   free(q);
68*7c3d14c8STreehugger Robot #endif
69*7c3d14c8STreehugger Robot   free(p);
70*7c3d14c8STreehugger Robot   return 0;
71*7c3d14c8STreehugger Robot }
72