6

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

例如,我想在下面的代码中实现 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;
}
4

2 回答 2

8

我一般同意那些认为这是一个坏主意的人。

也就是说,鉴于问题有UNIX标签,在类 UNIX 操作系统上执行此操作的经典方法是使用read()from /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;
}
于 2013-01-21T11:07:41.067 回答
0

这在技术上可能是可行的,但没有可移植的方式来做到这一点,而且永远没有必要这样做。如果您设法忘记了一个指针是否可写,那么还有很多您也不知道的更重要的细节,比如它指向什么,以及您的代码是否应该写入它.

于 2013-01-21T07:01:57.317 回答