4

我正在尝试调试memcpy尝试访问不存在且失败的内存位置的崩溃问题。以下是问题代码的简化版本:

void func_foo(int **a) {
   int *b, c;
   if (*a) {
       b = *a;
   }
   memcpy(&c, b, sizeof(int));//this crashes because address "b" is not accessible.
}

我的问题是:有没有办法在尝试之前检查内存是否可以访问memcpy,或者是否有另一种保护机制来防止这里的崩溃?在这种情况下,不检查**a也会导致崩溃吗?

4

2 回答 2

2

没有可移植的方式以编程方式测试指针是否指向有效的可访问内存。

这是强烈推荐的做法的一个原因,即当指针指向的内存被释放并在初始化时始终将指针设置为 NULL,因此您需要进行测试。

Would not checking **a cause a crash as well in this case?

正确,您在这里所做的只是将传入的值分配给本地然后尝试访问它。如果本地不好,那是因为传入的值不好。垃圾进垃圾出。


要解决您提供的代码:

   if (*a) {
       b = *a;
   }
   memcpy(&c, b, sizeof(int));//you really shouldn't be executing this at all unless
                              // you're setting b, so it should be within the if check 
                              // and only executed after b=*a
于 2013-06-03T19:27:21.457 回答
0

如果有人在 *a 中向您传递了一个垃圾指针,则无法检查(无论如何都与平台无关)是否可以访问该指针。

但是,如果有人传递 a==NULL 或 *a==NULL 你至少可以检查一下(埃里克在他对另一个答案的评论中首先提到了这一点):

void func_foo(int **a) 
{
   int *b= NULL, c;

   if (a!=NULL) {
       b = *a;
   }

   if (b!=NULL) {
       printf("about to access memory at address 0x%p\n", b);
       memcpy(&c, b, sizeof(int));//this crashes because address "b" is not accessible.
       // btw same as c= *b  or  c= **a; 
   }
   else {
       printf("someone passed us a null pointer either in a or *a\n");
   }
}

只是为了好玩,一个简化的版本是:

void func_foo(int **a) 
{
   int c;

   if (a!=NULL && *a!=NULL) {
       c = **a;
   }
   else {
       printf("someone passed us a null pointer either in a or *a\n");
   }
}
于 2013-06-03T22:47:56.850 回答