#include <stdio.h>
#include <stdlib.h>
typedef struct sample {
void* data;
}sample_t;
int main()
{
printf("Hello world!\n");
sample_t* samplestruct = (sample_t*) malloc(sizeof(sample_t));
samplestruct->data = (void*) malloc(10);
free(samplestruct->data);
free(samplestruct);
samplestruct->data = NULL;
samplestruct = NULL;
return 0;
}
在上面的代码中,我释放了两个&#39; samplestruct-&gt;数据&#39;和&#39; samplestruct&#39;然后按我自由的顺序将它们都设置为NULL。现在,代码没有崩溃应用程序。代码有问题吗?这可以在任何方面被利用(我的意思是安全性)?
答案 0 :(得分:2)
传统上,free
的实现在下次调用malloc
之前不会改变自由内存。在某些平台上仍然如此(这可能是您的代码不会崩溃的原因)但不能依赖并且不应该依赖。即使是这样,在多线程应用程序中,只有空闲的内存可能在调用free
和使用之间由不同的线程分配。通常,攻击者可以使用这种竞争条件使您的指针指向其他数据,可能是攻击者控制的数据。
不要像你问题中的代码那样编写代码。