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