Cod*_*ity 4 c arrays pointers memory-management
这是出于好奇,我试图在以前的问题上找到我怀疑的答案,但他们似乎没有答案.所以问这里,我刚写了一个代码,我试图将内存分配给一个int指针(填充一个数组)并将int值扫描给它.完成数组后,我想删除分配给指针的数据/内存.虽然我的代码工作正常,一切,为什么我仍然能看到int数组甚至是免费的后内值荷兰国际集团的指针.然而,如果我使用两次免费它会引发错误(这是在单次使用免费后预期的).这不是一个奇怪的行为吗?我在我的mac上尝试使用Xcode也在codechef,同样的行为,为什么?
int *num=(int *)malloc(n*sizeof(int));
int i;
for(i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
for(i=0;i<n-1;i++){
temp = some_function(x);
}
free(num);
for(i=0;i<n;i++)
{
printf("\nnum[%d]= %d\n",i,num[i]);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码打印num []内的值,理想情况下它不应该.
Bar*_*chs 10
这不奇怪,也不错.当调用free指针时,您只告诉内存管理器它可以再次使用该部分内存进行另一次malloc调用.它不会删除内容(这将花费额外的时间,没有任何功能).但是,您可以访问它,因为指针仍指向有效地址.但它会导致未定义的行为,因为内存管理器可能已将该内存提供给其他一些代码.
free第二次调用会产生错误,因为内存管理器不再知道该指针是有效的(你只是free它!).实际上,这是未定义的行为.
你的程序很顽皮,并且处理未定义的行为.
内存确实在第一次之后返回到系统free,它只是释放内存:
再次释放它会引发错误,因为您已经将其释放回系统.
这并不意味着你可以只是malloc记忆,free它再次,并依赖于以后仍能够访问它!
首先,您看到的行为是未定义的 - 根据C标准,您的程序并不真正有效.通过编译器,操作系统和环境的特定组合,您仍然可以在空闲后访问该内存的内容,但它可以轻松地中断.此外,"未定义的行为"允许编译器适应各种各样的恶作剧,使后来的代码完全不符合您的期望.
其次,在空闲之后的任何时刻,内存可用于后续的mallocs.因此,即使您依赖于编译器/ os /环境的行为而不是破坏免费使用后的代码,各种其他进程也可能会填充其他内容.
Use-after-free是一个非常大的nono,所以只需释放一次,永远不会访问释放的内存.
有关您可能遇到的安全问题类型,请参阅:https://cwe.mitre.org/data/definitions/416.html.
| 归档时间: |
|
| 查看次数: |
1142 次 |
| 最近记录: |