如何在运行时检查内存地址是否可写?
例如,我想在以下代码中实现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;
}
答案 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)
这可能在技术上是可行的,但没有可移植的方法这样做,而且永远不必这样做。如果你已经忘记了指针是否可写,那么还有一堆更为重要的细节你也不知道,比如它指向什么,以及你的代码是否写信与否。