这里我们有3个字符串:
char a1[ ] = "abc"; // static
char a2[4] = "abc"; // static
char* a3 = "abc"; // dynamic
测试功能仅作为示例
int test(char* v)
{
return (*v = '1')
}
让我们在主要和结果中进行测试
int main()
{
int n;
n = test(a1); // OK//
// if not '1' use malloc else leave it
n = test(a2); // OK
// if not '1' use malloc else leave it
n = test(a3); // const Error
// if not '1' use malloc else leave it
}
如何测试/检查a3指针?所以你可以采取像malloc();因为它不可编辑所以我们需要新的指针。
答案 0 :(得分:1)
test(a3);
会导致分段错误,因为您正在尝试编写进程的只读内存区域。所以,是的,您已经测试过它是否可写,但是测试因崩溃而失败。
测试写访问的重点是什么?
它们都是你自己的变量,你应该知道它们是什么。或者我错过了什么?
你的静态/动态是什么意思?你的意思是只读/可写吗?
C是一个简约的便携式汇编程序。它没有内省。它不存储有关其数据的各种信息。所以它无法完成。
答案 1 :(得分:1)
崩溃的原因并不是a3
是一个指针。它所指向的记忆是一个编入程序的常数,因此无法改变。
没有标准化的方法来测试是否是这种情况。它反对C哲学提供的功能需要许多程序员不能使用的运行时开销。
所以,如果你需要的话,你有责任跟踪这个。
您可能会看到的一件事是使用像splint这样的安全检查程序,我理解这会扫描您的代码以查找此类潜在问题。
答案 2 :(得分:1)
我找到了一个仅限Unix的解决方案。 readonly()
函数分叉,并在子进程中执行@ flexe的测试。两个优点:
如果指针p
指向只读内存,则以下函数返回true。
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int readonly(void *p)
{
pid_t pid = fork();
if (pid < 0) {
return -1;
} else if (pid == 0) { /* CHILD */
*(char *)p = 0; /* Causes segfault if buffer not writable */
exit(0); /* Otherwise child exits normally */
} else { /* PARENT */
int status;
wait(&status);
return WIFSIGNALED(status);
}
}