首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新指针(由malloc表示)与已释放的/旧指针之一相同。

新指针(由malloc表示)与已释放的/旧指针之一相同。
EN

Stack Overflow用户
提问于 2017-12-20 04:46:10
回答 3查看 519关注 0票数 5

我试图在C中跟踪免费使用的错误,我的问题是,如果我有这样的代码:

代码语言:javascript
复制
A * ptrA = malloc(sizeof(A));
A * aliasA = ptrA;
// do something ' 
free(ptrA) 
// some other code
B * ptrB = malloc(sizeof(B)); // assume this return same pointer as ptrA
//trying to use aliasA here

只是想知道aliasA的使用是否是UAF错误?如果是的话,这里出了什么问题?

为了澄清这个问题,我认为最好增加一个小例子:

代码语言:javascript
复制
int main(){
    int *ptr = (int *)malloc(4);
    *ptr = 5;
    int *ptr2 = ptr;
    printf("%d\n", *ptr);
    free(ptr);

    int *new_ptr = malloc(4);
    *new_ptr = 66;
    printf("%d\n", *ptr2);

    return 0;
}  

产出如下:

代码语言:javascript
复制
5
66

(我在ptrhttp://s2e.systems/中检查了S2E和new_ptr,这两个指针实际上指向同一个地址。释放ptr后,相同的地址分配给new_ptr。)

从上面的输出来看,ptr2的使用提供了与new_ptr相同的输出。

当我编写检测UAF错误的解决方案时,我会记录指针的信息。指针的值存储为uint64_t,布尔类型flag用于声明指针是否是活动的。

因此,当new_ptrptr指向相同的地址时,我猜会出现一个问题,因为一旦malloc()被调用,flag for new_ptr就会转换true。之后,当我使用ptr时,我无法检测这个UAF错误,因为这个地址是活动的。

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-20 09:03:47

如果不取消对指针aliasA的引用,则取决于“免费后使用”的定义,这是否构成“免费后使用”。例如,CWE-416不讨论仅仅使用指针值,而是谈到取消引用它,即使用已释放的对象。

但是,C标准指出,即使使用指针值也有未定义的行为(附录J.2)

  1. 在下列情况下未对行为进行定义: ..。
代码语言:javascript
复制
- The value of a pointer that refers to space deallocated by a call to the free or realloc function is used (7.22.3).

这是因为指针的值变为

当指针所指向的对象(或刚刚过去的)到达其生命周期的结束时,指针的值将变得不确定。

因此,以下代码具有未定义的行为:

代码语言:javascript
复制
A *ptrA = malloc(sizeof(A));
A *aliasA = ptrA;
free(ptrA);
A *ptrB = malloc(sizeof(A));

if (aliasA == ptrB) { // undefined behaviour, as it might be a trap
    printf("We were given the same pointer");
}

那里的比较是没有意义的,编译器可以自由地进行优化,因为aliasA不再需要包含有效值了。编译器甚至可以将陷阱设置到aliasA中,这将导致程序在if语句处使用诊断信息中止。或者,即使它们被赋予了不同的内存地址,它们也可能指向相同的地址,反之亦然。

票数 3
EN

Stack Overflow用户

发布于 2017-12-20 06:42:51

这个一个UAF错误。

实际上,第二个malloc()调用不太可能返回与aliasA相同的地址,因为行为没有得到保证。你不应该依赖它。

你可能会问:我能比较一下他们的地址吗?嗯,不是。比较可能对您有一定的意义,但它是未定义的行为,因为只有当两个指针指向同一数组中的不同元素时,指针相等比较才有效。在这种情况下,两个分配的块肯定不是同一个数组,因此这些指针之间的比较没有很好的定义。

最后,您不应该依赖malloc()返回的地址。您所能做的就是在调用时所请求的内存量内使用它。

在实践中,是一个很好的追求方式。

票数 1
EN

Stack Overflow用户

发布于 2017-12-20 06:31:42

aliasA是UAF错误,它可能持有与ptrA相同的值,但没有得到保证,建议将释放的指针(包括aliasA和ptrA)重新分配给NULL,以避免悬吊指针

在您的情况下,最好在NULL之后分配free

代码语言:javascript
复制
free(ptrA);
free(aliasA);
ptrA = NULL;
aliasA = NULL;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47898934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档