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

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

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

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

这就是说,考虑到这个问题有UNIX标记,在类UNIX操作系统上做这个的经典方法是使用/dev/zeroread()

 #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; } 

这在技术上可能是可行的,但是没有可行的方法来实现,而且也不必这样做。 如果您已经设法忽略了指针是否可写,那么还有一些您不知道的更重要的细节,比如它指向的内容,以及代码是否应该写入。