"双免费"是什么意思?

chr*_*rds 23 c theory double-free

正如标题所暗示的那样,我是C的新手并且很快就会出现中期.我正在修改过去的论文,一个反复出现的主题是双重免费问题.我知道这是free()两次调用相同内存位置的过程,但我有几个问题,我不是100%肯定如何回答:

问题1:C中双重释放的结果是什么,为什么会出现这样的问题?

这将导致双倍免费:

char* ptr = malloc(sizeof(char));

*ptr = 'a';
free(ptr);
free(ptr);
Run Code Online (Sandbox Code Playgroud)

我对此的回应是,它会返回0x0内存地址并导致系统不稳定/崩溃.此外,如果我没记错的话,双重自由实际上可以调用malloc两次,这会导致缓冲区溢出,从而使系统容易受到攻击.

简要总结这个问题的最佳方法是什么?

问题2:描述一种特别容易在C中引入双重免费的情况?

我在想当你绕过指针时可能会意外地将它释放到一个函数中,并且在没有意识到的情况下再次释放它?

再说一次,总结这个的"最佳"方法是什么?

tem*_*def 24

从技术上讲,C中的双重自由会导致不确定的行为.这意味着该程序可以完全随意地运行,所有投注都不会发生.发生这当然是一件坏事!实际上,双重释放内存块会破坏内存管理器的状态,这可能会导致现有的内存块被破坏,或者将来的分配以奇怪的方式失败(例如,相同的内存分配给两个不同的连续呼叫malloc).

在各种情况下都可能发生双重释放.一个相当常见的是当多个不同的对象都有指向彼此的指针并开始通过调用来清理free.发生这种情况时,如果您不小心,free在清理对象时可能会多次使用相同的指针.不过,还有很多其他案例.

希望这可以帮助!


zer*_*_yu 5

因为free()将通过在每个区域之前管理存储在标签中的信息来合并相邻区域。这就像管理双链表一样。因此,如果ptr指向的缓冲区已被攻击字符串覆盖,并且可以在其中插入假标签,则将很危险。


Wea*_*ane 5

这个问题已经得到很好的回答,但由于“重复问题”链接,我添加了一个迟到的答案,该链接询问“如何避免它?”

在发布的示例代码中添加了一行。

char* ptr = malloc(sizeof(char));

*ptr = 'a';
free(ptr);
ptr = NULL;         // add this
free(ptr);
Run Code Online (Sandbox Code Playgroud)

函数freeNULL指针不做任何事情。

  • 这仅在只有一个指向一块内存的指针的微不足道的情况下才有用。在有多个指向同一内存的指针的更常见情况下,情况要复杂得多。 (7认同)