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

最佳答案

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

这是高度推荐的做法的一个原因,即在指针指向的内存被释放和初始化时始终将指针设置为 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

关于c - 如何检查内存是否可访问?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16903713/

10-11 22:38
查看更多