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 に答える