Я пытался использовать mprotect
сначала против чтения, а затем записи.
Здесь мой код
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pagesize = sysconf(_SC_PAGE_SIZE);
int *a;
if (posix_memalign((void**)&a, pagesize, sizeof(int)) != 0)
perror("memalign");
*a = 42;
if (mprotect(a, pagesize, PROT_WRITE) == -1) /* Resp. PROT_READ */
perror("mprotect");
printf("a = %d\n", *a);
*a = 24;
printf("a = %d\n", *a);
free (a);
return 0;
}
Под Linux вот результаты:
Вот вывод для PROT_WRITE
:
$ ./main
a = 42
a = 24
и для PROT_READ
$ ./main
a = 42
Segmentation fault
В Mac OS X 10.7:
Вот вывод для PROT_WRITE
:
$ ./main
a = 42
a = 24
и для PROT_READ
$ ./main
[1] 2878 bus error ./main
Пока я понимаю, что поведение OSX/Linux может отличаться, но я не понимаю, почему PROT_WRITE
не крашит программу при чтении значения с printf
.
Кто-нибудь может объяснить эту часть?
PROT_WRITE
выйдет из строя? - person Art   schedule 16.09.2013PROT_WRITE
память должна быть нечитаемой, насколько мне известно. Если вы хотите доступ RW, вам нужен флагPROT_WRITE | PROT_READ
- person Mali   schedule 16.09.2013*a = 24
. Во всяком случае, я попытался охватить все это в своем ответе. - person Art   schedule 16.09.2013