xref: /llvm-project/compiler-rt/test/asan/TestCases/Linux/mincore.cpp (revision 673dc3d4a0b0fbb3b9b34ae2ecbfa522627fe582)
1*673dc3d4SNico Weber // RUN: %clangxx_asan -std=c++11 -O0 %s -o %t && %run %t
2*673dc3d4SNico Weber 
3*673dc3d4SNico Weber #include <assert.h>
4*673dc3d4SNico Weber #include <unistd.h>
5*673dc3d4SNico Weber #include <sys/mman.h>
6*673dc3d4SNico Weber 
main(void)7*673dc3d4SNico Weber int main(void) {
8*673dc3d4SNico Weber   unsigned char vec[20];
9*673dc3d4SNico Weber   int res;
10*673dc3d4SNico Weber   size_t PS = sysconf(_SC_PAGESIZE);
11*673dc3d4SNico Weber   void *addr = mmap(nullptr, 20 * PS, PROT_READ | PROT_WRITE,
12*673dc3d4SNico Weber                     MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
13*673dc3d4SNico Weber 
14*673dc3d4SNico Weber   res = mincore(addr, 10 * PS, vec);
15*673dc3d4SNico Weber   assert(res == 0);
16*673dc3d4SNico Weber   for (int i = 0; i < 10; ++i)
17*673dc3d4SNico Weber     assert((vec[i] & 1) == 0);
18*673dc3d4SNico Weber 
19*673dc3d4SNico Weber   for (int i = 0; i < 5; ++i)
20*673dc3d4SNico Weber     ((char *)addr)[i * PS] = 1;
21*673dc3d4SNico Weber   res = mincore(addr, 10 * PS, vec);
22*673dc3d4SNico Weber   assert(res == 0);
23*673dc3d4SNico Weber   for (int i = 0; i < 10; ++i)
24*673dc3d4SNico Weber     assert((vec[i] & 1) == (i < 5));
25*673dc3d4SNico Weber 
26*673dc3d4SNico Weber   for (int i = 5; i < 10; ++i)
27*673dc3d4SNico Weber     ((char *)addr)[i * PS] = 1;
28*673dc3d4SNico Weber   res = mincore(addr, 10 * PS, vec);
29*673dc3d4SNico Weber   assert(res == 0);
30*673dc3d4SNico Weber   for (int i = 0; i < 10; ++i)
31*673dc3d4SNico Weber     assert((vec[i] & 1) == 1);
32*673dc3d4SNico Weber 
33*673dc3d4SNico Weber   return 0;
34*673dc3d4SNico Weber }
35