如何检查内存是否可访问?

时间:2013-06-03 18:49:16

标签: c memcpy

我正在尝试调试崩溃问题,其中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是否会导致崩溃?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果有人在* a中传递垃圾指针,则无法检查(无论是否平台无关)是否可以访问。

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

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");
   }
}