如何在运行时检查内存地址是否可写?

时间:2013-01-21 06:35:42

标签: c unix operating-system

如何在运行时检查内存地址是否可写?

例如,我想在以下代码中实现is_writable_address。有可能吗?

#include <stdio.h>

int is_writable_address(void *p) {
    // TODO
}

void func(char *s) {
    if (is_writable_address(s)) {
        *s = 'x';
    }
}

int main() {
    char *s1 = "foo";
    char s2[] = "bar";

    func(s1);
    func(s2);
    printf("%s, %s\n", s1, s2);
    return 0;
}

2 个答案:

答案 0 :(得分:5)

我通常同意那些暗示这是一个坏主意的人。

尽管如此,鉴于该问题具有 UNIX 标记,在类UNIX操作系统上执行此操作的经典方法是使用read()中的/dev/zero

#include <fcntl.h>
#include <unistd.h>

int is_writeable(void *p)
{
    int fd = open("/dev/zero", O_RDONLY);
    int writeable;

    if (fd < 0)
        return -1; /* Should not happen */

    writeable = read(fd, p, 1) == 1;
    close(fd);

    return writeable;
}

答案 1 :(得分:0)

这可能在技术上是可行的,但没有可移植的方法这样做,而且永远不必这样做。如果你已经忘记了指针是否可写,那么还有一堆更为重要的细节你也不知道,比如它指向什么,以及你的代码是否写信与否。