| /* { dg-do run { target { sysconf && mmap } } } */ |
| /* { dg-options "-O2" } */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <unistd.h> |
| #include <sys/mman.h> |
| |
| #ifndef MAP_ANONYMOUS |
| #define MAP_ANONYMOUS MAP_ANON |
| #endif |
| |
| int |
| __attribute__ ((noclone, noinline)) |
| compare (char *d, char *s, unsigned int l) |
| { |
| return __builtin_strncmp (d, s, l); |
| } |
| |
| int |
| main () |
| { |
| size_t page_size = sysconf(_SC_PAGESIZE); |
| char *buf = mmap (0, 2 * page_size, PROT_READ | PROT_WRITE, |
| MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); |
| if (buf == MAP_FAILED) |
| { |
| perror ("mmap"); |
| abort (); |
| } |
| |
| if (mprotect (buf + page_size, page_size, PROT_NONE)) |
| { |
| perror ("mprotect"); |
| abort (); |
| } |
| |
| char *src1 = buf + page_size - sizeof ("foo"); |
| char *src2 = buf; |
| memcpy (src1, "foo", sizeof ("foo")); |
| memcpy (src2, "foo", sizeof ("foo")); |
| int result = compare (src1, src2, sizeof ("foo") + 16); |
| if (result != 0) |
| abort (); |
| return 0; |
| } |