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