メモリ保護属性の調べかた

以下の方法でメモリが読み書き可能かどうかを調べられることを知りました。要は loopback な pipe を作ってそのメモリの内容を write してみて書き出せたら readable で、その後同じ内容をそのメモリに read してみて読み出せたら writable 。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

void error_exit() {
    perror("pipe");
    exit(EXIT_FAILURE);
}

int check_readable(int* lb, void* p) {
    char b;
    return write(lb[1], p, 1) >= 0 && read(lb[0], &b, 1) >= 0;
}

int check_writable(int* lb, void* p) {
    return write(lb[1], p, 1) >= 0 && read(lb[0], p, 1) >= 0;
}

void check_access(const char* msg, int* lb, void* p) {
    printf("%s:\t", msg);
    puts(printf("%s%s",
                check_readable(lb, p) ? "readable " : "",
                check_writable(lb, p) ? "writable" : "")
         ? "" : "nothing");
}

int main() {
    int loopback[2];
    if (pipe(loopback)) {
        error_exit();
    }

    check_access("stack", loopback, loopback);
    check_access("heap", loopback, malloc(1));
    check_access("code", loopback, &main);
    check_access("null", loopback, NULL);

    close(loopback[0]);
    close(loopback[1]);

    return 0;
}

実行結果は以下のようになりました。

stack:  readable writable
heap:   readable writable
code:   readable
null:   nothing
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h