Tôi đã cố gắng sử dụng mprotect
để đọc trước, sau đó viết.Hành vi của PROT_READ và PROT_WRITE với mprotect
Là ở đây mã của tôi
#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;
}
Dưới Linux, đây là kết quả:
Đây là kết quả cho PROT_WRITE
:
$ ./main
a = 42
a = 24
và cho PROT_READ
$ ./main
a = 42
Segmentation fault
.210
Theo Mac OS X 10.7:
Đây là kết quả cho PROT_WRITE
:
$ ./main
a = 42
a = 24
và cho PROT_READ
$ ./main
[1] 2878 bus error ./main
Cho đến nay, tôi hiểu rằng hành vi OSX/Linux có thể khác nhau, nhưng tôi không hiểu tại sao PROT_WRITE
không làm hỏng chương trình khi đọc giá trị với printf
.
Ai đó có thể giải thích phần này?
Tại sao bạn mong đợi 'PROT_WRITE' gặp sự cố? – Art
vì chỉ với cờ "PROT_WRITE', bộ nhớ được cho là không thể đọc được AFAIK. Nếu bạn muốn truy cập rw, bạn cần 'PROT_WRITE | PROT_READ' cờ – Mali
@Mali đúng, điều đó sẽ có ý nghĩa như một câu hỏi nếu anh ta mong đợi một sự cố khi đọc trong đối số cho printf đầu tiên, không phải khi ghi đè giá trị bằng '* a = 24'. Dù sao, tôi đã cố gắng để trang trải tất cả điều này trong câu trả lời của tôi. – Art