我看的是 the c programming language 8.7 a storage allocator,
里头就提供了 malloc.c 的一种实作。
以这个实作来说, free 之后, 如果没有再次呼叫 malloc/free,
被 free 的那块应该是可以安全使用, 因为没有人会改写指向 free 的位址的
linked list 资料结构。
但我不确定其他的实作品有什么其他的魔法, 会造成这种效果。
一点心得:
https://descent-incoming.blogspot.com/2015/06/c-mallocfree.html
※ 引述《lovejomi (JOMI)》之铭言:
: 最近被问说 为什么use after free后 你使用那块memory的话 "有可能"会crash 或是
: 不会
: 我答不出来(这边不讨论 delete后 值被改动 foo->ptr已经变成垃圾指标 造成的acces
: s violation)
: 原因是 如果只是单纯access 不管是read write, 我都不觉得会crash.... 以下是我
: 的测试和认知
: https://ideone.com/HKYiIQ
: int* ptr = new int;
: *ptr = 123;
: cout << "before: " << ptr << ":" << *ptr << endl; (1)
: delete ptr;
: cout << "read after free: " << ptr << ":" << *ptr << endl; (2)
: *ptr = 456; // write after free
: cout << "read after free: "<< ptr << ":" << *ptr << endl; (3)
: 我的认知
: new会透过cstdlib malloc要一块 valid的user space address (他应该会跟OS要超过我d
: emand的)
: 然而我delete了 除了cstdlib里面free做了一些事情外 , 他很可能也会跟OS讲说我这块
: memory已经没有要使用了(这边不确定是不是每次 这是不是造成下面行为差异的主因)
: 再来我连续的 对这块内存做读取 和 写入
: 1. 如果只是读取而已 有没有可能 造成crash? (以我测试来说 从没因为read 而cras
: h, 但如果真的有可能会 我想知道为什么)
: 2. 写入比较不理解, 我拿到的是user space address, 虽然我delete了 但我write的时
: 候并没有写在其他超出user space的内存或是read-only的区段
: 为什么 "有机会" 造成 SIGSEGV? 到底是谁 raise这signal?
: 3. 上面程式码 (2) "有时候"会印出*ptr = 0,有时候是原来数值, 虽然我也只知道值不
: 可预期, 但我想问的是, 到底是谁把0 写入进去? 是cstdlib吗? 如果是的话 照理讲要每
: 次都变0, 但显然不是每次
: 以我测试, 如果我挂上valgrind ./a.out ==> 这行就不会变0 维持原来数值, 一旦直
: 接./a.out 就会是0
: 以上到底是谁介入了? 这件事我想说很可能是-O之类的差异 但我发现似乎不是 deb
: ug / release build都有这种现象.
: 然而有时候这一行就直接SIGSEGV了如同2.所问的问题
: 4. 我有用signal handler 撷取这SIGSEVG 我天真的想要把这件事给吃下来
: 但我看文章说 signal handler return后会回到 原本执行到的code
: 以我测试来说 我会 无限循环的触发SIGSEGV , 想问一下是不是不可能吃得下来 一
: 定要 abort或是把handler设定成default 让系统自己handle
: 5. 补个问题我尝试在ubuntu产生core dump
: 大概做了几件事
: echo 'core_%e.%p' | sudo tee /proc/sys/kernel/core_pattern
: core_%e.%p
: ulimit -c unlimited
: gdb a.out