如何检查/测试字符串是静态的还是动态的并且可以编辑

时间:2014-03-25 22:29:50

标签: c

这里我们有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();因为它不可编辑所以我们需要新的指针。

3 个答案:

答案 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);
    }
}