如何在glibc中检测到双重释放?

Sec*_*ret 1 c free glibc

* glibc detected ./load: double free or corruption (!prev): ADDRESS **
Run Code Online (Sandbox Code Playgroud)

使用glibc时,它是如何知道我是双重释放的?它是否跟踪我拍摄和释放的所有内容?它是否包含在元数据中,比如免费知道有多少空闲空间(免费如何知道要释放多少?)

kel*_*tar 6

对于每个分配,内存管理器保留一些"标头"(最可能是树节点或链表).当你传递给一些不包含有效标题的东西时 - 好吧,它无法正确释放.至于保存这些信息的地方 - 它取决于实现,但通常它放在你从malloc获得的地址之前 - 但是,大小和结构很可能是未知的,但至少它让人知道这个标题有多容易被打破/损坏/覆盖/等.