#include <iostream>
#include <cstring>
#include <sys/mman.h>
int main() {
char *mem1 = (char*) mmap(NULL, 8192, PROT_READ | PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
mprotect(mem1 + 4096, 4096, PROT_NONE); // disallow access to second page
std::memset(mem1, 0, 4096);
char mem2[8192] = {0};
mem2[4094] = 1;
std::cout << std::memcmp(mem1 + 1, mem2, 4095) << std::endl; //works
std::cout << std::memcmp(mem1 + 1, mem2, 8192) << std::endl; //crashes
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CgppbnQgbWFpbigpIHsKICAgICAgICBjaGFyICptZW0xID0gKGNoYXIqKSBtbWFwKE5VTEwsIDgxOTIsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9QUklWQVRFfE1BUF9BTk9OWU1PVVMsIC0xLCAwKTsKICAgICAgICBtcHJvdGVjdChtZW0xICsgNDA5NiwgNDA5NiwgUFJPVF9OT05FKTsgIC8vIGRpc2FsbG93IGFjY2VzcyB0byBzZWNvbmQgcGFnZQogICAgICAgIHN0ZDo6bWVtc2V0KG1lbTEsIDAsIDQwOTYpOwogICAgICAgIGNoYXIgbWVtMls4MTkyXSA9IHswfTsKICAgICAgICBtZW0yWzQwOTRdID0gMTsKCiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6bWVtY21wKG1lbTEgKyAxLCBtZW0yLCA0MDk1KSA8PCBzdGQ6OmVuZGw7ICAvL3dvcmtzCiAgICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6bWVtY21wKG1lbTEgKyAxLCBtZW0yLCA4MTkyKSA8PCBzdGQ6OmVuZGw7ICAvL2NyYXNoZXMKCiAgICAgICAgcmV0dXJuIDA7Cn0KCg==